Yuque Archive
寻常的路

React状态管理库Mobx

Mobx和Redux相似,是状态管理工具。Mobx本身和React无关,但也提供了React绑定库。与Redux相比,Mobx更像是为React而生。

要做什么

做一个非常简单的计算器,只需要可以计算加法。页面上有两个输入框,要求计算结果可以实时响应用户的输入,即在输入框输入数字,后面立即显示计算结果。

环境准备

安装Moxb模块:

安装支持装饰器的mobx preset:

运行eject命令弹出配置:

在package.json中配置preset:

未使用Mobx

代码似乎比较简单,先导入模块:

把渲染函数写出来:

然后写App组件的内容,定义:

构造函数初始化状态,一共三个属性:

inputHandler()是input事件的处理函数,这里使用受控组件来获取数据:

使用计算属性根据输入,更新相应的属性值,并计算更新sum的值。最后是渲染到页面的内容:

代码就这么多,运行程序试一下效果吧!

没错,程序是错的,React官方的文档里明确指出,页面的渲染值不应该依赖状态,因为状态的更新是异步的。

解决这个问题也很简单,将setState()的传入参数改为函数即可。对inputHandler()做一些修改:

现在的程序就能实现功能了。

使用了Mobx

与未使用Mobx相比,使用Mobx最大的不同就是将状态从组件中抽离出来单独管理,这也正是状态管理库的初衷。

首先导入模块:

创建状态类,再由类生成对象:

因为装饰器用于类,所以首先定义类,再实例化出对象。这里的store不像Redux中的store,拥有一些内置方法。Mobx中的action不需要dispatch。

@observable装饰器标识一个可监听的对象,@computed装饰器会自动计算监听对象的动作,与Vue.js的计算属性有相似之处。

在渲染函数中,就得将store传入组件:

在App中使用store:

@observer装饰器来自mobx-react模块,用于将React组件变成响应式组件。

组件内容除了不再初始化状态,以及调用属性的位置不同,与不使用Mobx差异不大。其实这正说明了Mobx的简单易用。

如果将Mobx与Redux做对比,Redux就要繁琐一些了,Redux中store、reducer、action缺一不可。