import {observable} from 'mobx';

var appState = observable({
    timer: 0
});
import {observer} from 'mobx-react';

@observer
class TimerView extends React.Component {
    render() {
        return (
            <button onClick={this.onReset.bind(this)}>
                Seconds passed: {this.props.appState.timer}
            </button>
        );
    }

    onReset() {
        this.props.appState.resetTimer();
    }
};

ReactDOM.render(<TimerView appState={appState} />, document.body);
appState.resetTimer = action(function reset() {
    appState.timer = 0;
});

setInterval(action(function tick() {
    appState.timer += 1;
}), 1000);

 

1. State(状态)
状态 是驱动应用的数据, 就像是有数据的excel表格。
2. Derivations(衍生)
任何源自状态并且不会再有任何进一步的相互作用的东西就是衍生。 

用户界面
衍生数据,比如剩下的待办事项的数量。
后端集成,比如把变化发送到服务器端。
MobX 区分了两种类型的衍生:
Computed values(计算值) - 它们是永远可以使用纯函数(pure function)从当前可观察状态中衍生出的值。

Reactions(反应) - Reactions 是当状态改变时需要自动发生的副作用。
需要有一个桥梁来连接命令式编程(imperative programming)和响应式编程(reactive programming)。
它们最终都需要实现I / O 操作。
黄金法则: 如果你想创建一个基于当前状态的值时,请使用 computed。
3. Actions(动作)
动作 可以改变状态的代码。用户事件、后端数据推送、预定事件、等等。
如果是在严格模式下使用 MobX的话,MobX 会强制只有在动作之中才可以修改状态。

 

原则:

MobX 支持单向数据流,也就是动作改变状态,而状态的改变会更新所有受影响的视图。

当状态改变时,所有衍生都会进行原子级的自动更新,所有衍生默认都是同步更新。

计算值 是延迟更新的,所有的计算值都应该是纯净的。它们不应该用来改变状态

 

eg:

import {observable, autorun} from 'mobx';

var todoStore = observable({
    /* 一些观察的状态 */
    todos: [],

    /* 推导值 */
    get completedCount() {
        return this.todos.filter(todo => todo.completed).length;
    }
});

/* 观察状态改变的函数 */
autorun(function() {
    console.log("Completed %d of %d items",
        todoStore.completedCount,
        todoStore.todos.length
    );
});

/* ..以及一些改变状态的动作 */
todoStore.todos[0] = {
    title: "Take a walk",
    completed: false
};
// -> 同步打印 'Completed 0 of 1 items'

todoStore.todos[0].completed = true;
// -> 同步打印 'Completed 1 of 1 items'

 

 posted on 2019-09-26 11:41  不了无明  阅读(272)  评论(0编辑  收藏  举报