概念与原则
概念与原则
概念
MobX 区分了以下几个应用中的概念。 在之前的要点中已经见过了,现在让我们更深入地了解它们。
1. State(状态)
状态
是驱动应用的数据。 通常有像待办事项列表这样的领域特定状态
,还有像当前已选元素的视图状态
。 记住,状态
就像是有数据的excel表格。
2. Derivations(衍生)
任何
源自状态
并且不会再有任何
进一步的相互作用的东西就是衍生。 衍生以多种形式存在:
用户界面
MobX 区分了两种类型的衍生:
Computed values(计算值)
- 它们是永远可以使用纯函数(pure function)从当前可观察状态中衍生出的值。
刚开始使用 MobX 时,人们倾向于频繁的使用 reactions。 黄金法则: 如果你想创建一个基于当前状态的值时,请使用 computed
。
回到excel表格这个比喻中来,公式是计算
值的衍生。但对于用户来说,能看到屏幕给出的反应
则需要部分重绘GUI。
3. Actions(动作)
动作
是任一一段可以改变状态
的代码。用户事件、后端数据推送、预定事件、等等。 动作
类似于用户在excel单元格中输入一个新的值。
在 MobX 中可以显式地定义动作,它可以帮你把代码组织的更清晰。 如果是在严格模式
下使用 MobX的话,MobX 会强制只有在动作之中才可以修改状态。
原则
MobX 支持单向数据流,也就是动作
改变状态
,而状态
的改变会更新所有受影响的视图
。
当状态
改变时,所有衍生
都会进行原子级的自动
更新。因此永远不可能观察到中间值。
所有衍生
默认都是同步
更新。这意味着例如动作
可以在改变状态
之后直接可以安全地检查计算值。
计算值
是延迟
更新的。任何不在使用状态的计算值
将不会更新,直到需要它进行副作用(I / O)操作时。 如果视图不再使用,那么它会自动被垃圾回收。
所有的计算值
都应该是纯净
的。它们不应该用来改变状态
。
实例
下面的代码清单举例说明了以上的概念和原则:
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'
Copy
在10分钟入门 MobX 和 React中你可以深入本示例并且围绕它使用 React 来构建用户页面。