首页 技术 正文
技术 2022年11月16日
0 收藏 563 点赞 3,654 浏览 2158 个字

前言

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

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

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

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

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

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

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

介绍

1.入门

 React + MobX 状态管理入门及实例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

效果图:

 React + MobX 状态管理入门及实例mobx-demo.gif

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,912
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,436
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,251
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,063
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,694
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,732