虽然听起来可能很魔幻,但使一个APP变成可响应的只需要3步:
在任何你喜欢的数据结构中存储状态,对象、数组、类、循环引用的数据结构、引用,都可以。 只需要确保那些你希望随时改变的属性被标记,以使其可观察。
import {observable} from 'mobx';
var appState = observable({
timer: 0
});
你现在可以创建一个视图(View),只要appState
中的数据发生变化,这个视图可以自动更新。MobX会找到成本最小的方式更新你的视图。
这个简单的方法节省了你成吨的脚手架,并且非常有效~.
通常来说,任何函数都可以变成一个观察关联数据的可响应的视图。MobX可以用于ES5的环境,但这里也有一个ES6的例子。
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();
}
};
React.render(<TimerView appState={appState} />, document.body);
(resetTimer
方法的实现见下一部分)
第三件要做的事情就是改变状态。这是你的应用只需要做的全部事情。与其他框架不同,MobX并不限制你的方式。 这里有很多最佳实践,但请记住这个关键点, MobX帮助你用最简单直观的方式去做事
下面这个代码会每秒钟改变你的数据,并且UI会在需要的时候自动更新。 你不需要定义控制器(controller)函数去改变状态,或者让视图变得需要更新,因为MobX会自动检测所有的关系。 这是改变状态的两个例子:
appState.resetTimer = action(function reset() {
appState.timer = 0;
});
setInterval(action(function tick() {
appState.timer += 1;
}), 1000);
使用action
包裹函数,只有在严格模式下才是必须的(严格模式默认是关闭状态)。
但推荐使用action,因为它会帮助你更好地构建你的应用、并且表达你的意图——你的这个函数是用于改变状态的。
并且会自动应用事务行为(transaction)以优化性能。
可以尝试这个例子JSFiddle,或者clone MobX boilerplate project