observable(可观察的数据)

数组

import { observable, isArrayLike } from 'mobx'

const arr = observable(['a', 'b', 'c']);

// 观察之后,数组将不是真正的数组,而是一个Observable数组
console.log(arr, Array.isArray(arr), isArrayLike(arr); // ObservableArray false true // 但是可以依然像数组一样操作数据
console.log(arr[0]); // a
console.log(arr.pop()) // c

对象

const obj = observable({a: 1, b:2});

// 返回的也不是纯对象,而是一个被转化的可被观察的对象
console.log(obj) //ObservableObjectAdministration // 同样也可以直接对该对象进行读取
console.log(obj.a, obj.b) // 1 2 // TODU: mobx只能对已有的属性进行监视,so,在初始化的时候添加可被监视的属性,如果有倔脾气的童鞋,我就要新添加的属性进行监视,你能不能行?笑话,男人怎么能被说不行呢。如果要调用新添加的属性呢,使用extendObservable()

Map集合

const map = observable(new Map());

// 同样也是转化之后的,可被观察的map
console.log(map) //ObservableMap // 同样也可以直接调用map方法
map.set('a', 1);
console.log(map.has('a')); // true map.delete('a');
console.log(map.has('a')); // false

Number、String、Boolean

// Number、String、Boolean原始数据类型需要用observable.box()来包装可被观察的变量。
var num = observable.box(20)
var str = observable.box('hello')
var bool = observable.box(true) console.log(num, str, bool); // 三个都是可被观察的ObservableValue类型
// 如果要用到原始类型值,需要用observable.get()
console.log(num.get(), str.get(), bool.get()) // 20 'hello' true // 如果想要修改原始类型值,需要用observable.set()
num.set(50);
str.set('world');
bool.set(false);
console.log(num.get(), str.get(), bool.get()) // 50 'world' false

使用修饰器

class Store {
@observable array = [];
@observable obj = {};
@observable map = new Map(); // 敏感的童鞋可能会问了,诶,不是说原始数据类型用什么box还有get、set么,因为mobx为了简化Api,在修饰器observable里做了数据类型判断。
@observable string = 'hello';
@observable number = 20;
@observable bool = false;
}

观察数据变化的方式

computed

// 首先引入computed
import { observable, isArrayLike, computed } from 'mobx'; // 用法1
var store = new Store(); var foo = computed(function() {
// 拼接被观察的两个数据
return store.string + '/' + store.number;
}); // 当数据改变时,调用此方法
foo.observe(function(change) {
// change代表当前改变的变量值
console.log(change);
}); // 当修改可观察数据时,会触发foo.observe
store.string = 'world'
store.number = 30 console.log(foo); // observableValue类型
console.log(foo.get()); // 拼接后的字符串 // 用法2,在store里直接用修饰器语法使用
class Store {
@observable array = [];
@observable obj = {};
@observable map = new Map(); @observable string = 'hello';
@observable number = 20;
@observable bool = false; // 通过这个方法,只能得到最终的计算值,不能获取observe的方法了
@computed get mixed() {
return store.string + '/' + store.number;
}
}

autorun

// 引用autorun
import { observable, isArrayLike, computed, autorun } from 'mobx'; // 初始化会自动运行,修改autorun中任意可观察数据可触发aoturun
autorun(() => {
console.log(store.string + '/' + store.number); // hello/20
});
store.string = 'world'; // world/20
store.number = 30; // world/30

when

// 引入when
import { observable, isArrayLike, computed, autorun, when } from 'mobx'; // when 接收两个函数,第一个为布尔值,当只有第一个为true的时候,才会执行第二个函数,并且保证最多只被执行一次。
// TUDU: 第一个参数为布尔值,必须是一个可观察数据,不能根据普通变量
// TUDO: 如果一开始就返回真,那么第二个函数会同步立即执行
when(() => store.bool, () => console.log("it's true"));
store.bool = true; // "it's true"

reaction

// 引入reaction
import { observable, isArrayLike, computed, autorun, when, reaction } from 'mobx'; // 当引入的可观察数据发生变化时,触发第二个函数
reaction(() => [store.string, store.number], arr => console.log(arr.join('/')));
store.string = 'world'; // world/20
store.number = 30; // world/30

action

// 引入action
import { observable, isArrayLike, computed, autorun, when, reaction, action } from 'mobx'; class Store {
@observable array = [];
@observable obj = {};
@observable map = new Map(); @observable string = 'hello';
@observable number = 20;
@observable bool = false; @action bar() {
this.string = 'world';
this.number = 30;
}
}
reaction(() => [store.string, store.number], arr => console.log(arr.join('/')));
// 在action里修改,这样reaction只被触发了一次,提高性能
store.bar(); // world/30 // 使用runInAction方法,同样只会触发一次
runInAction(() => {
store.string = 'world';
store.number = 30;
})

mobx-react

PropTypes

// react的PropTypes可以限制参数的类型,但是可观察数据类型不是原始类型,所以需要使用mobx-react的PropTypes

// 引入PropTypes 更改名称,防止和react PropTypes重名
import { PropTypes as ObservablePropTypes } from 'mobx-react' action propTypes = {
array: ObservablePropTypes.observableArray
}

observer

// 引入observer
import {observer, PropTypes as ObservablePropTypes } from 'mobx-react' // 不同于observable修饰器,它不是修饰类成员的,而是修饰类本身的(react组件类。谁真正的用到了被修改的可观察数据,谁修重渲染,谁就被observer修饰) @observer
class Bar extends Conponent {
static propTypes = {
array: ObservablePropTypes.observableArray
};
render() {
const array = this.props.array;
return <div>{array.length}</div>
}
}

常用工具函数

toJS

var obj =observable({
x: 1
}); var clone = toJS(obj); // isObservableObject 判断是否是observable对象
console.log(isObservableObject(obj)); // true
console.log(isObservableObject(clone)); // false

observe

// 引入observe
import { observe, observable, isArrayLike, computed, autorun, when, reaction, action } from 'mobx'; // 纯函数,用于监听被观察数据发生变化
constructor() {
// 每次this.list列表发生变化的时候都会触发回调函数
observe(this.list, change => {
console.log(change)
})
}

spy

// 用于监控所有事件 对可观察数据的每次修改, 对autorun、reaction的每次触发
spy(event => {
console.log(event) // 每次都会调用,如果不限制会浪费性能
})

mobx 入门的更多相关文章

  1. MobX入门

    MobX入门 本文尝试解释MobX是如何运作的.我们将用MobX创建一个小案例.如果你正在找靠谱的MobX文档,可以去看官方文档. 什么是MobX 官方文档的解释:简洁,易扩展的状态管理.简单来说,M ...

  2. redux和mobx入门使用

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

  3. 1-2 Mobx 入门实践之TodoList(官方Demo)

    第一步:导入模块 import React, { Component } from 'react'; import { observable, autorun,computed } from 'mob ...

  4. MobX入门示例

    在相当长的一段时间内,Redux 都是前端开发人员作为状态管理的首先框架,如果不会 Redux,你都不好意思跟别人说自己是搞前端的. 没过多久,开发者们开始意识到,这东西虽说盛行,但它并没有传说中的那 ...

  5. 【MobX】391- MobX 入门教程(下)

    点击上方"前端自习课"关注,学习起来~ 三.MobX 常用 API 介绍 3. 修改可观察数据 在上一部分内容中,我们了解到,对可观察的数据做出反应的时候,需要我们手动修改可观察数 ...

  6. 【MobX】390- MobX 入门教程(上)

    点击上方"前端自习课"关注,学习起来~ 本文考虑到篇幅问题,将<MobX 入门教程>分成上.下两篇文章,方便阅读.分配安排: 一.MobX 介绍 首先看下官网介绍: ★ ...

  7. 【MobX】MobX 简单入门教程

    一.MobX 介绍 首先看下官网介绍: MobX 是一个经过战火洗礼的库,它通过透明的函数响应式编程(transparently applying functional reactive progra ...

  8. MobX+react使用小demo

    第一次接触mobx,网上找了很多例子,写此主要总结一下create-react-app + mobx入门 create-react-app myreact cd myreact npm install ...

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

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

随机推荐

  1. 高可用Hadoop平台-应用JAR部署

    1.概述 今天在观察集群时,发现NN节点的负载过高,虽然对NN节点的资源进行了调整,同时对NN节点上的应用程序进行重新打包调整,负载问题暂时得到缓解.但是,我想了想,这样也不是长久之计.通过这个问题, ...

  2. Spring Boot 解决方案 - 会话

    连接无状态 使用 HTTP 的连接是无状态的,因此为了应对需要状态的服务例如用户登录,诞生了适合保存状态的设计-会话(session),本文就来探讨一下会话. 会话的使用 Spring Mvc 中使用 ...

  3. iOS开发(3):tips提示 | 如何提示一行文字或一个图片

    我有一个需求:在点击或长按某个按钮时,显示提示,包括简单的文字提示,还有复杂一点的图片甚至是动态图的提示(可能还要加上文字),怎么实现呢? (1)文字tips 使用之前介绍的qmuikit里面的QMU ...

  4. PostgreSQL查询优化逻辑优化之其他

    上一节我们介绍了PostgreSQL的子查询优化,子查询优化把一部分可以优化的子查询上拉到主查询成为join. preprocess_expression 将表达式(目标列,where,join,ha ...

  5. git第八节---git 撤销和回滚

    # git 撤销 1. 未添加进暂存区的撤销  --未git add 2.添加进暂存区的撤销--  已git add 未git commit 未添加进暂存区的撤销命令:git checkout -- ...

  6. Java设计模式学习记录-迭代器模式

    前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...

  7. 【NET CORE微服务一条龙应用】第二章 配置中心使用

    背景 系列目录:[NET CORE微服务一条龙应用]开始篇与目录 在分布式或者微服务系统里,通过配置文件来管理配置内容,是一件比较令人痛苦的事情,再谨慎也有湿鞋的时候,这就是在项目架构发展的过程中,配 ...

  8. S5PV210 时钟体系分析

    S5PV210 时钟体系 如下面时钟结构图所示,S5PV210 中包含 3 大类时钟域, 分别是主系统时钟域(简称 MSYS).显示相关的时钟域(简称 DSYS). 外围设备的时钟域(简称 PSYS) ...

  9. c# Cache 使用实例

    /// <summary> /// 创建缓存项的文件 /// </summary> /// <param name="key">缓存Key< ...

  10. 百度api查询多个地址的经纬度的问题

    在使用百度api查询多个地址的经纬度的时候,由于百度api提供的经纬度查询方法是回调函数,并且后续操作必须等经纬度获取完成才能进行,问题就存在于怎么判断所有地点是否都回调完成了,问了之前的一个前端大佬 ...