mobx-vue

? Vue bindings for MobX

Github星跟蹤圖

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

主要指標

概覽
名稱與所有者mobxjs/mobx-vue
主編程語言TypeScript
編程語言TypeScript (語言數: 4)
平台
許可證MIT License
所有者活动
創建於2018-05-25 06:37:42
推送於2023-03-02 18:07:01
最后一次提交2022-12-07 11:12:50
發布數21
最新版本名稱v2.2.0 (發布於 )
第一版名稱v1.0.0 (發布於 2018-05-30 11:37:57)
用户参与
星數477
關注者數9
派生數20
提交數115
已啟用問題?
問題數47
打開的問題數17
拉請求數52
打開的拉請求數5
關閉的拉請求數5
项目设置
已啟用Wiki?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?