在相当长的一段时间内,Redux 都是前端开发人员作为状态管理的首先框架,如果不会 Redux,你都不好意思跟别人说自己是搞前端的。

没过多久,开发者们开始意识到,这东西虽说盛行,但它并没有传说中的那么好用,代码写起来过于繁重,开发效率低下。MobX 出现之后,越来越多的人开始放弃 Redux,转投 MobX 的怀抱。

MobX 以一种更为优雅的方式组织状态,完全解放了开发者,使我们不再做代码的奴隶,而是真正翻身做了主人,轻松自由地管理状态。

今天,我们就来了解一下如何使用 MobX,这里不讲解它的原理和细节,只演示在项目中如何应用。

我们假设有一个 Todo 模块,那么与之对应的,应该创建一个 TodoStore 类,代码如下:

// src/stores/todo.js

// `mobx`中的三个API
import { action, observable, computed } from 'mobx'; // Todo组件对应的store
class TodoStore {
// todoList是一个被观察的数据对象
@observable todoList = [
{
name: 'doing',
}
]; // loadMore是一个用于操作数据的方法
@action loadMore() {
// 模拟异步请求
setTimeout(() => {
this.todoList = [
...this.todoList,
{
name: 'new schedule',
}
];
}, 300);
} // 数据发生变化时自动更新total的值
@computed get total() {
return this.todoList.length;
}
} export default new TodoStore();

一般来说,一个应用中有多个模块,所以我们需要一个 store 的入口文件,将众多模块的 store 组织起来:

// src/stores/index.js

import todoStore from './todo';

// 组织各个模块对应的store
export default {
todoStore,
};

最后,在我们应用的入口文件中,引入 stores 入口文件:

// src/index.js

import React from 'react';
import ReactDOM from 'react-dom'; // `mobx-react`中的三个API
import { inject, observer, Provider } from 'mobx-react'; import stores from './stores'; // 注入需要的store 并将Todo组件定义为数据的观察者
// 注意顺序 inject在先 observer靠后
@inject('todoStore')
@observer
class Todo extends React.Component {
loadMore = () => {
// 被注入的store可以通过props访问
this.props.todoStore.loadMore();
}; render() {
const { todoStore } = this.props; return (
<div>
<div>{ `${todoStore.total} loaded:` }</div>
{
todoStore.todoList.map((item, index) => {
return <div key={index}>{ item.name }</div>;
})
}
<div onClick={this.loadMore}>-Load More-</div>
</div>
);
}
} ReactDOM.render(
<Provider {...stores}>
<Todo />
</Provider>,
document.getElementById('root')
);

这就是一个最简单的 MobX 应用模型了。

最新文章

  1. ERwin&#174; Data Modeler介绍
  2. linux KERNEL 问题
  3. HTML 5 &lt;input&gt; placeholder 属性
  4. MySQL常用问题解决方法
  5. 《JavaScript Ninja》之挥舞函数
  6. 十大技巧优化Android App性能
  7. C# 汉字转拼音(转)
  8. Word 中没有Endnote工具栏的解决方法
  9. Java this 心得
  10. IBM X3650 服务器更换内存的过程记录
  11. Oracle 中的Userenv()
  12. poj 2021 Relative Relatives(暴力)
  13. jQuery Mobile 入门基础教程
  14. 序列化为XML
  15. 关于XML(可扩展标记语言)的基础知识与写法
  16. linux中的三个文件时间
  17. 与LINQ有关的语言特性
  18. 无法打开锁文件 /var/lib/dpkg/lock - open (13: 权限不够)
  19. div容器中内容垂直居中
  20. KDevelop调试NS2

热门文章

  1. 30-ESP8266 SDK开发基础入门篇--SPI
  2. 不刷新网页修改url链接:history.pushState()和history.replaceState()新增、修改历史记录用法介绍
  3. 每日一问:谈谈对 MeasureSpec 的理解
  4. 安装goimports
  5. [.Net,C#]三类资源:流对象Stream,字节数组byte[],图片Image
  6. ef core 全局过滤
  7. winform 通用自动更新程序
  8. in 和 exists的区别
  9. Python【每日一问】32
  10. sqlserver替换一个单引号为多个单引号