Mobx入門和較佳實踐

justb發表於2018-12-19

之前講到過我們團隊從redux遷移到mobx,為什麼我們拋棄了redux呢?一個很重要的原因就是使用redux開發,程式碼量增多,複雜度增大,同時需要維護api,action,reducer,即使是藉助redux-thunk或者redux-promise這樣的中介軟體,action這一層的程式碼量感覺還是太多了,光是actionType的命名都需要斟酌思考,mobx將action和reducer結合到了一起,省去了type的命名,以及es6+的裝飾器的引入,整個程式碼量和複雜度降低了不少,自從用了mobx整個人都輕鬆了許多!

首先簡單介紹一下mobx,他和redux類似資料都是單向流動,通過action改變state,促使view更新

img

下面讓我們來擼一個簡單的例子吧

//store.js
import { observable, autorun, flow, computed, when, reaction, action } from 'mobx';
import * as api from './api';

class UserStore {
    @observable
    basicInfo = {};
    
    // constructor函式裡面可以放一些初始化的action
    constructor() {
        // when如果沒有第二個引數,則返回一個promise,配合await或yield使用
        when(   
            // 一旦...
            () => false,
            // ... 然後
            () => this.dispose()
        )
    }
    
    // 在observable物件發生變化時,會呼叫,第二個參數列示配置,有delay和onError
    auto = autorun(
        e => {
            // console.log(e);
        },
        { delay: 3000 }
    );
    
    // autorun的變種,可以更精確的配置物件的屬性
    myReaction = reaction(() => this.isLogined, isLogined => console.log('myReaction'));
    
    // 類似vue中computed的用法
    @computed
    get total() {
        console.log(this.currentStaffInfo);
        return this.currentStaffInfo;
    }

    getBasicInfo = flow(function*() {
        try {
            // 這裡也可以呼叫其他action
            this.basicInfo = (yield api.queryInfo()).payload;
        } catch (error) {
            this.basicInfo = {};
        }
    });
    
    @action
    setBasicInfo = value => {
        this.basicInfo = value;
    };
}

export default new UserStore();
複製程式碼
//User.jsx
import React, { Component } from 'react';
import { observer, Provider, inject } from 'mobx-react';
import UserStore from './store';

@inject('UserStore')
@observer
class User extends Component {
    componentDidMount() {
        this.props.UserStore.getBasicInfo()
    }
    render() {
        return (
            <div>
                {this.props.UserStore.basicInfo.name}
            </div>
        );
    }
}

export default (
    <Provider UserStore={UserStore}>
        <User />
    </Provider>
);
複製程式碼

這樣就大功告成啦,怎麼樣,mobx是不是特別簡單清爽,mobx還有很多其他特性,希望大家能夠多多去探索交流!

相關文章