目录
1.Mobx介绍
1.1 mobx要点
- 定义状态并使其可观察:通过mobx中observable打上标记,即可做到
- 创建视图用以相应状态变化:通过mobx-react中observer装饰组件,使组件做到响应式
- 更改状态:通过mobx中action包装函数,在函数中修改定义的值
1.2 概念与原则
-
状态:是驱动应用的数据,就像是有数据的excel表格。
-
衍生:
-
源自状态的东西就是衍生,以一下几种形式存在
- 用户界面
- 衍生数据
- 后端集成
-
mobx区分了两种类型衍生
- computed计算值(自动响应变化的值)
- reactions反应:状态改变时自身的副作用(自动响应变化的副作用)
-
-
actions动作:任何一段可以改变状态的代码
2.常用API
- observable
- computed:函数中涉及到的变量一旦变化就会生成新的值。如果没有地方使用此值,那么他会停止更新,可通过keepAlive参数保持更新
- action:用于装饰修改状态的函数
- observer:mobx-react提供,将react组件变为响应式,本质上是对数据变化的反应
- autorun:和computed很类似,一旦函数中用到的数据变化,会自动执行autorun中函数,最开始会执行一遍
- reaction:和autorun类似,但是一开始不会执行一遍。接受两个函数,第一个函数就是依赖项,作为第二个函数的入参。能更细粒度监听数据。
- Provider: mobx-react提供,将store传递给所有子组件
- inject:mobx-react提供,将store注入到子组件中,子组件在props中接收
- toJS:observable 数据结构转换成普通的 javascript 对象并忽略计算值
3.mobx会对什么作出反应
MobX 会对在追踪函数执行过程中读取现存的可观察属性做出反应
- “读取” 是对象属性的间接引用,可以用过 . (例如 user.name) 或者 [] (例如 user['name']) 的形式完成。
- “追踪函数” 是 computed 表达式、observer 组件的 render() 方法和 when、reaction 和 autorun 的第一个入参函数。
- “过程(during)” 意味着只追踪那些在函数执行时被读取的 observable 。这些值是否由追踪函数直接或间接使用并不重要。
不会作出反应的情况:
message 被改变了,但它不是 observable,它只是一个引用 observable 的变量,但是变量(引用)本身并不是可观察的。
message = observable({ title: "Foo" })
autorun(() => {
console.log(message.title)
})
message = observable({ title: "Bar" })
title只是一个字符串,并非observable
var title = message.title;
autorun(() => {
console.log(title)
})
message.title = "Bar"
author追踪的是message.author对应的引用,引用中的数据变化的才会引起变化
const author = message.author;
autorun(() => {
console.log(author.name)
})
message.author = { name: "John" };
异步访问:autorun 执行期间没有访问到任何 observable,而只在 setTimeout 执行期间访问了。
autorun(() => {
setTimeout(
() => console.log(message.title),
10
)
})
message.likes.push("Jennifer");
4.mobx redux异同
共同点
- 两者都是为了解决状态不好管理,无法有效同步的问题而产生的工具。
- 都是用来统一管理应用状态的工具
- 某一个状态只有一个可靠的数据来源
- 操作更新的方式是统一的,并且是可控的
- 都支持store与react组件,如react-redux,mobx-react;
不同点
- redux将数据保存在单一的store中,而mobx将数据保存在分散的多个store中
- redux使用plain object保存数据,需要手动处理变化后的操作,mobx使用observable保存数据,数据变化后自动处理响应的操作。
- redux使用的是不可变状态,意味着状态只是只读的,不能直接去修改它,而是应该返回一个新的状态,同时使用纯函数;mobx中的状态是可变的,可以直接对其进行修改。
- mobx相对来说比较简单,在其中有很多的抽象,mobx使用的更多的是面向对象的思维,redux会比较复杂,因为其中的函数式编程思想掌握起来不是那么容易,同时需要借助一系列的中间件来处理异步和副作用。
- mobx中有更多的抽象和封装,所以调试起来会更加复杂,同时结果也更难以预测,而redux提供可以进行时间回溯的开发工具,同时其纯函数以及更少的抽象,让调试变得更加容易。
- mobx可以利用自带的computed函数生成缓存数据,redux不行,需要通过插件(如reselect)实现比较繁琐
- redux-thunk的作用是支持派发异步action,通过注入中间件实现