1.observable
Observable 值可以是JS基本数据类型、引用类型、普通对象、类实例、数组和映射
class Store {@observable count = 0//一定要加这一行constructor(){makeAutoObservable(this)}@actionincrement=()=>{this.count++}foo='bar'}
2.autorun
当你想创建一个响应式函数,而该函数本身永远不会有观察者时,可以使用 mobx.autorun。 这通常是当你需要从反应式代码桥接到命令式代码的情况,例如打印日志、持久化或者更新UI的代码
import {observable,action,makeAutoObservable, autorun} from 'mobx'autorun(()=>{//当store.count发生改变。他会自动触发,需要给数据成员加上@observableconsole.log(store.count,'gggg');console.log(store.foo,'gggg');}
3.computed
计算值(computed values)是可以根据现有的状态或其它计算值衍生出的值。 概念上来说,它们与excel表格中的公式十分相似。 不要低估计算值,因为它们有助于使实际可修改的状态尽可能的小。 此外计算值还是高度优化过的,所以尽可能的多使用它们。
class Store {@observable price=10@observable num=5@computed get totalPice(){return this.price*this.num}}
<p>总价格:{store.totalPice}</p><p>总价格:{store.totalPice}</p><p>总价格:{store.totalPice}</p>
计算属性存在缓存,使用多次实际只会执行一次,当依赖的属性发生改变他才会重新执行
4.action
4.1 基本使用
需要改变observable中的数据,最好使用action修改,尽可能避免使用store.的方式直接修改
import React from 'react';import ReactDOM from 'react-dom';import {observable,action,makeAutoObservable, autorun,computed} from 'mobx'import {observer}from 'mobx-react'//1.初始化mobx仓库class Store {@observable count = 0//一定要加这一行constructor(){makeAutoObservable(this)}@actionincrement=()=>{this.count++}foo='bar'@observable price=10@observable num=5@computed get totalPice(){return this.price*this.num}@action change(){this.count=10this.foo='hello'this.foo='word'}}const store=new Store()autorun(()=>{//这里只触发了一次console.log(store.foo,store.count,'fffrrrf');})store.count=20store.foo='ttt'store.change()@observerclass App extends React.Component{render(){const {store}=this.propsreturn(<div><h1>我是一个仓库</h1><h2>{store.count}</h2><button onClick={store.increment}>增加</button><p>总价格:{store.price*store.num}</p></div>)}}ReactDOM.render(<App store={new Store()}/>,document.getElementById('root'));
4.2 action.bound
绑定this,让当前this指向store,注意: action.bound 不要和箭头函数一起使用;箭头函数已经是绑定过的并且不能重新绑定。
4.3 异步action
严格模式下无法直接修改异步方法
import React from "react";import ReactDOM from "react-dom";import {observable,action,makeAutoObservable,autorun,configure,runInAction} from "mobx";import { observer } from "mobx-react";configure({enforceActions: "observed",});//初始化mobx仓库class Store {@observable count = 0;@observable num1 = 0;@observable num2 = 0;//一定要加这一行constructor() {makeAutoObservable(this);}@actionincrement = () => {this.count++;};//1.定义一个同步函数用于修改,在异步函数中调用@action.boundchangeCountAsync() {setTimeout(() => {this.shngecount()}, 1000);}@action.boundshngecount(){this.count=100}//2.在异步函数中调用action函数,第一参数是修改函数的名称,这里使用函数自调用@action.boundchangenum1Async() {setTimeout(() => {action('changnum1',()=>{console.log(this);this.num1=1002})()}, 1000);}//3.使用runInAction@action.boundchangenum2Async() {setTimeout(() => {runInAction(()=>{console.log(this);this.num2=1003})}, 1000);}}const store = new Store();;autorun(() => {//当store.count发生改变。他会自动触发,需要给数据成员加上@observableconsole.log( store.count, "fffrrrf");console.log( store.num1, "num1ffrrrf");console.log( store.num2, "num2ffrrrf");});//函数调用store.changeCountAsync()store.changenum1Async()store.changenum2Async()@observerclass App extends React.Component {render() {const { store } = this.props;return (<div><h1>我是一个仓库</h1><h2>{store.count}</h2><button onClick={store.increment}>增加</button></div>);}}ReactDOM.render(<App store={new Store()} />, document.getElementById("root"));
5.configure
强制使用action修改数据,使用严格模式。
import {observable,action,makeAutoObservable, autorun,computed,configure} from 'mobx'configure({enforceActions:'observed'})
6.runInAction
import React from 'react';import ReactDOM from 'react-dom';import {observable,action,makeAutoObservable, autorun,computed,configure,runInAction} from 'mobx'import {observer}from 'mobx-react'configure({enforceActions:'observed'})//1.初始化mobx仓库class Store {@observable count = 0@observable foo= 'sxsddde'//一定要加这一行constructor(){makeAutoObservable(this)}@actionincrement=()=>{this.count++}}const store=new Store()autorun(()=>{console.log(store.foo,store.count,'fffrrrf');})//修改数据成员,适用于不定义actionrunInAction(()=>{store.count=10store.foo='hello'})@observerclass App extends React.Component{render(){const {store}=this.propsreturn(<div><h1>我是一个仓库</h1><h2>{store.count}</h2><button onClick={store.increment}>增加</button></div>)}}ReactDOM.render(<App store={new Store()}/>,document.getElementById('root'));
