mobx-vue

? Vue bindings for MobX

Github stars Tracking Chart

mobx-vue

npm version
coverage
npm downloads
Build Status

Vue bindings for MobX, inspired by mobx-react

logo

Installation

npm i mobx-vue -S

or

yarn add mobx-vue

Requirement

  • Vue >= 2.0.0
  • MobX >= 2.0.0, compatible with MobX 5!

Why mobx-vue

MobX is an unopinionated, scalable state management, which can make our programming more intuitive.

Unlike the other vue-rx-inspired libraries which based on the plugin mechanism of vue, mobx-vue will be the simplest you ever meet. What you all need is to bind your state in component definition and observe it just like mobx-react does, then your component will react to your state changes automatically which managed by mobx.

And, the most important is that you can build a view-library-free application, if you wanna migrate to another view library(React/Angular) someday, rewrite the template and switch to the relevant mobx bindings(mobx-react,mobx-angular,mobx-angularjs) is all you have to do.

Articles:

Usage

We highly recommend using the bindings with vue-class-component decorator, and define the Store/ViewModel independently.

import { action, computed, observable } from "mobx";
export default class ViewModel {
    @observable age = 10;
    @observable users = [];

    @computed get computedAge() {
        return this.age + 1;
    }

    @action.bound setAge() {
        this.age++;
    }
    
    @action.bound async fetchUsers() {
    	this.users = await http.get('/users')
    }
}
<template>
    <section>
        <p v-text="state.age"></p>
        <p v-text="state.computedAge"></p>
        <p v-for="user in state.users" :key="user.name">{{user.name}}</p>
        <button @click="state.setAge"></button>
    </section>
</template>

<script lang="ts">
    import Vue from "vue";
    import Component from "vue-class-component";
    import { Observer } from "mobx-vue";
    import ViewModel from "./ViewModel";

    @Observer
    @Component
    export default class App extends Vue {
        state = new ViewModel()
        mounted() { 
            this.state.fetchUsers();
        }
    }
</script>

Or used with the traditional way:

<script lang="ts">
    import { observer } from "mobx-vue";
    import ViewModel from "./ViewModel";

    export default observer({
        data() {
            return { state: new ViewModel() }
        },
        mounted() {
            this.state.fetchUsers() 
        }
    })
</script>

All you need is to bind your state to component and observe it. No more reactive data definitions in component.

Tips: If you're tired of instantiating instance manually every time, you might wanna try the mmlpx library which leveraged a dependency injection system.

API

  • observer((VueComponent, options): ExtendedVueComponent

Main metrics

Overview
Name With Ownermobxjs/mobx-vue
Primary LanguageTypeScript
Program languageTypeScript (Language Count: 4)
Platform
License:MIT License
所有者活动
Created At2018-05-25 06:37:42
Pushed At2023-03-02 18:07:01
Last Commit At2022-12-07 11:12:50
Release Count21
Last Release Namev2.2.0 (Posted on )
First Release Namev1.0.0 (Posted on 2018-05-30 11:37:57)
用户参与
Stargazers Count477
Watchers Count9
Fork Count20
Commits Count115
Has Issues Enabled
Issues Count47
Issue Open Count17
Pull Requests Count52
Pull Requests Open Count5
Pull Requests Close Count5
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private