前言

现在最热门的前端框架,毫无疑问是React。

React是一个状态机,由开始的初始状态,通过与用户的互动,导致状态变化,从而重新渲染UI。

对于小型应用,引入状态管理库是"奢侈的"。

但对于复杂的中大型应用,引入状态管理库是"必要的"。

现在热门的状态管理解决方案Redux,MobX相继进入开发者的视野。

正如爱因斯坦所说的 “ 让一切事物尽可能的简单,但不要简单”。

尽管让我们来填一填 MobX 的坑。

介绍

1.入门

 
image

对于应用开发中的常见问题,React 和 MobX都提供了最优和独特的解决方案。React 提供了优化UI渲染的机制, 这种机制就是通过使用虚拟DOM来减少昂贵的DOM变化的数量。MobX 提供了优化应用状态与 React 组件同步的机制,这种机制就是使用响应式虚拟依赖状态图表,它只有在真正需要的时候才更新并且永远保持是最新的。

2.安装

npm install --save mobx mobx-react

3.核心概念

1.state(状态)
状态是驱动应用的数据。

2.observable(value) && @observable
Observable 值可以是JS基本数据类型、引用类型、普通对象、类实例、数组和映射。其修饰的state会暴露出来供观察者使用。

const map = observable.map({ key: "value"});
map.set("key", "new value"); const list = observable([1, 2, 4]);
list[2] = 3; const person = observable({
firstName: "Clive Staples",
lastName: "Lewis"
});
person.firstName = "C.S."; const temperature = observable(20);
temperature.set(25);

3.observer(观察者)
被observer修饰的组件,将会根据组件内使用到的被observable修饰的state的变化而自动重新渲染

import {observer} from "mobx-react";

var timerData = observable({
secondsPassed: 0
}); setInterval(() => {
timerData.secondsPassed++;
}, 1000); @observer class Timer extends React.Component {
render() {
return (<span>Seconds passed: { this.props.timerData.secondsPassed } </span> )
}
}; React.render(<Timer timerData={timerData} />, document.body);

4.action(动作)
只有在 actions 中,才可以修改 Mobx 中 state 的值。
注意:当你使用装饰器模式时,@action 中的 this 没有绑定在当前这个实例上,要用过 @action.bound 来绑定 使得 this 绑定在实例对象上。

@action.bound setName () {
this.myName = 'HUnter'
}

actions ------> state ------> view

5.computed
计算值(computed values)是可以根据现有的状态或其它计算值衍生出的值。
getter:获得计算得到的新state并返回。
setter: 不能用来直接改变计算属性的值,但是它们可以用来作“逆向”衍生。

class Foo {
@observable length = 2;
@computed get squared() {
return this.length * this.length;
}
set squared(value) { // 这是一个自动的动作,不需要注解
this.length = Math.sqrt(value);
}
}

6.autorun
这通常是当你需要从反应式代码桥接到命令式代码的情况,例如打印日志、持久化或者更新UI的代码。

var numbers = observable([1,2,3]);
var sum = computed(() => numbers.reduce((a, b) => a + b, 0)); var disposer = autorun(() => console.log(sum.get()));
// 输出 '6'
numbers.push(4);
// 输出 '10' disposer();
numbers.push(5);
// 不会再输出任何值。`sum` 不会再重新计算。

经验法则:如果你有一个函数应该自动运行,但不会产生一个新的值,请使用autorun。 其余情况都应该使用 computed。

7.reactions
Reactions 和计算值很像,但它不是产生一个新的值,而是会产生一些副作用,比如打印到控制台、网络请求、递增地更新 React 组件树以修补DOM、等等。 简而言之,reactions 在 响应式编程命令式编程之间建立沟通的桥梁。

4.应用实例

1.TodoList

技术栈:react + react-router(v4)+mobx+webpack

效果图:

 
mobx-demo.gif

很简单的一个小demo,这里不分析了,源码里有部分注释帮助理解。

React + MobX 状态管理入门及实例的更多相关文章

  1. mobx状态管理快速入门

    1.mobx状态管理   安装: creact-react-app mobx  

  2. React的状态管理工具

    Mobx-React : 当前最适合React的状态管理工具   MobX 简单.可扩展的状态管理        MobX 是由 Mendix.Coinbase.Facebook 开源和众多个人赞助商 ...

  3. react的状态管理

    近两年前端技术的发展如火如荼,大量的前端项目都在使用或转向 Vue 和 React 的阵营, 由前端渲染页面的单页应用占比也越来越高,这就代表前端工作的复杂度也在直线上升,前端页面上展示的信息越来越多 ...

  4. React项目中使用Mobx状态管理(二)

    并上一节使用的是普通的数据状态管理,不过官方推荐使用装饰器模式,而在默认的react项目中是不支持装饰器的,需要手动启用. 官方参考 一.添加配置 官方提供了四种方法, 方法一.使用TypeScrip ...

  5. React项目中使用Mobx状态管理(一)

    1.安装 $ yarn add mobx mobx-react 2.新建store/index.js,存放数据(以下思路仅限于父子组件的简单应用) 注意:这里暂时没使用装饰器@observable,装 ...

  6. Mobx-React : 当前适合React的状态管理工具

    MobX 简单.可扩展的状态管理        MobX 是由 Mendix.Coinbase.Facebook 开源和众多个人赞助商所赞助的.    安装 安装: npm install mobx ...

  7. 对于React各种状态管理器的解读

    首先我们要先知道什么是状态管理器,这玩意是干啥的? 当我们在多个页面中使用到了相同的属性时就可以用到状态管理器,将这些状态存到外部的一个单独的文件中,不管在什么时候想使用都可以很方便的获取. reac ...

  8. Redux状态管理方法与实例

    状态管理是目前构建单页应用中不可或缺的一环,也是值得花时间学习的知识点.React官方推荐我们使用Redux来管理我们的React应用,同时也提供了Redux的文档来供我们学习,中文版地址为http: ...

  9. react+redux状态管理实现排序 合并多个reducer文件

    这个demo只有一个reducer 所以合并reducer这个demo用不到 ,但是我写出来这样大家以后可以用到,很好用,管理多个reducer,因为只要用到redux就不会只有一个reducer所以 ...

随机推荐

  1. Mac配置环境变量path

    查看当前配置的path有哪些: 1. echo $PATH  当前所有的 2. cat /etc/paths  这个文件是操作系统自带的 mac系统环境变量的加载顺序(优先级): /etc/profi ...

  2. jenkins离线安装插件的方法(无法访问外网)

    最近项目要迁移环境,无法访问外网,因此jenkins的安装配置需要离线操作,在此记录 jenkins下载安装好之后,跳过插件的安装,新建用户进入jenkins界面,这些前置步骤我在之前的随笔里有写具体 ...

  3. Ubuntu18.04 显卡驱动+Cuda安装踩坑记录 以及Ubuntu虚拟内存的添加

    前几天买了张亮机卡,终于把主显卡成功直连到Unraid OS的虚拟机上了.然后就开始安装ubuntu系统开始配置环境,遇到了不少坑,特此记录. gcc版本问题 在安装显卡驱动的时候,不要修改gcc版本 ...

  4. Flask中的路由、实例化参数和config配置文件

    Flask中的路由 endpoint 别名不能重复,对应的视图函数,默认是视图函数名.endpoint 才是路由的核心.视图函数与路由的对应关系.可以通过url_for 反向创建url # metho ...

  5. 从壹开始学习 NetCore 新篇章 ║ Blog.Core 开发社之招募计划书

    宫 哈喽大家好,国庆马上就要来了,在新的第四季度来临之际,祝大家年末能顺顺利利,解决所有的难题.大家可能从我的标题里也能看的出来,老张又要耍花样,搞事情了,近来随着 netcore 3.0 的正式推出 ...

  6. Scrapy项目 - 实现斗鱼直播网站信息爬取的爬虫设计

    要求编写的程序可爬取斗鱼直播网站上的直播信息,如:房间数,直播类别和人气等.熟悉掌握基本的网页和url分析,同时能灵活使用Xmind工具对Python爬虫程序(网络爬虫)流程图进行分析.   一.项目 ...

  7. 【ADO.NET基础】加密方法公共类

    各种加密方法集锦: using System; using System.Security.Cryptography; using System.Text; using System.IO; usin ...

  8. 理解JS引擎的执行机制

    首先,请牢记2点: (1) JS是单线程语言 (2) JS的Event Loop是JS的执行机制.深入了解JS的执行,就等于深入了解JS里的event loop 1.灵魂三问 : JS为什么是单线程的 ...

  9. 004-python面向对象,错误,调试和测试

    ---恢复内容开始--- 1.面向对象 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...

  10. 一步一步剖析Dictionary实现原理

    本文是对c#中Dictionary内部实现原理进行简单的剖析.如有表述错误,欢迎指正. 主要对照源码来解析,目前对照源码的版本是.Net Framwork 4.8,源码地址. 1. 关键的字段和Ent ...