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
浙公网安备 33010602011771号