在相当长的一段时间内,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 应用模型了。

MobX入门示例的更多相关文章

  1. redux和mobx入门使用

    redux和mobx入门使用 项目涉及技术 公共插件 create-react-app react-dom react-router react-router-dom react-hook redux ...

  2. [WCF编程]1.WCF入门示例

    一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...

  3. Maven入门示例(3):自动部署至外部Tomcat

    Maven入门示例(3):自动部署至外部Tomcat 博客分类:  maven 2012原创   Maven入门示例(3):自动部署至外部Tomcat 上一篇,介绍了如何创建Maven项目以及如何在内 ...

  4. 1.【转】spring MVC入门示例(hello world demo)

    1. Spring MVC介绍 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于 ...

  5. 【java开发系列】—— spring简单入门示例

    1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...

  6. Spring MVC 入门示例讲解

    在本例中,我们将使用Spring MVC框架构建一个入门级web应用程序.Spring MVC 是Spring框架最重要的的模块之一.它以强大的Spring IoC容器为基础,并充分利用容器的特性来简 ...

  7. Couchbase之个人描述及入门示例

    本文不打算抄袭官方或者引用他人对Couchbase的各种描述,仅仅是自己对它的一点理解(错误之处,敬请指出),并附上一个入门示例. ASP.NET Web项目(其他web开发平台也一样)应用规模小的时 ...

  8. Velocity魔法堂系列一:入门示例

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...

  9. OUYA游戏开发核心技术剖析OUYA游戏入门示例——StarterKit

    第1章  OUYA游戏入门示例——StarterKit StarterKit是一个多场景的游戏示例,也是OUYA官方推荐给入门开发者分析的第一个完整游戏示例.本章会对StarterKit做详细介绍,包 ...

随机推荐

  1. 异常CLRDBG_NOTIFICATION_EXCEPTION_CODE( 0x04242420)

    简介 CLRDBG_NOTIFICATION_EXCEPTION_CODE,值为0x0x04242420.此异常在.CLR 4.0的启动路径期间触发,是CLR4.0版本初始化调试服务时向调试器发送消息 ...

  2. [PHP] windows下tee指令

    在win下使用tee指令 tee为Linux指令,tee把日志输出到log的同时输出到屏幕. 在 http://sourceforge.net/projects/unxutils/?source=dl ...

  3. 笔记&想要置顶但懒得置顶的文章目录

    1.\(\text{Markdown&Latex}\)学习笔记 2.一些笔记 3.好东西 4.线段树学习笔记 5.并查集学习笔记 6.友链 7.语录

  4. 绘制matplotlib 饼状图

    参考:https://blog.csdn.net/ScarlettYellow/article/details/80458797 (2)2016年就业人员在三次产业中分布的饼状图. def swap( ...

  5. 有趣的js代码

    for ( ; ; ) { window.alert(" ∧_∧ ババババ\n( ・ω・)=つ≡つ\n(っ ≡つ=つ\n`/ )\n(ノΠU\n何回閉じても無駄ですよ-ww\nm9(^Д^) ...

  6. 【Codeforces】B. Div Times Mod

    B. Div Times Mod time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  7. 《BLACK HAT PYTHON3》

    Black Hat Python3 kali 安装新版本python kali中自带的pyhton是2.7版本,显然2019年了,python2.x的版本已经逐渐过时,好多第三方库都逐步宣布不再支持p ...

  8. .net core中使用efcore

    官网:https://docs.microsoft.com/zh-cn/aspnet/core/data/ef-mvc/intro?view=aspnetcore-2.2#register-the-s ...

  9. mysql 添加注释

    给表添加注释:  alter table m_tb100_disabledsoldier comment '残疾士兵';   给表中的字段添加注释alter table m_tb100_disable ...

  10. JAVA读写CSV文件

    最近工作需要,需要读写CSV文件的数据,简单封装了一下 依赖读写CSV文件只需引用`javacsv`这个依赖就可以了 <dependency> <groupId>net.sou ...