mobx 核心思想
Actions 修改state
state 更新触发 Computed values
组件触发 reactions
reacttions 调用 Actions
State 是可观察和最低限度定义的,可以ishi任意类型
Computed values 是可以
class
实例成员 类成员
实例身上可以使用的属性和方法 public static
constroctor
get/set
实例成员
类成员(实例成员
类成员
构造函数直接调用的属性和方法
class App{
public a=1
b=2
public fn(){}
构造器中的实例成员需要在参数内定义
constructor(
public c=3
public fn=()=>{}
){}
存储器定义
get fn(){}
set fn(value){
}
类成员
static a = 1
}
const app = new App()
安装
要想使用 mobx 第一步必须配置装饰器识别的环境。mobx 要用到装饰器 @ ,在原生中不识别这种语法。
yarn eject
yarn add mobx mobx-react:这两个是必须的包,与装饰器无关
yarn add babel-plugin-transform-decorators-legacy -D
yarn add @babel/preset-env -D
yarn add babel-plugin-transform-class-properties -D
yarn add @babel/plugin-proposal-decorators -D
配置 package.json 中的 bable
"babel": {
"plugins": [
[
"@babel/plugin-proposal-decorators",
{
"legacy": true
}
],
注意: class 和 properties 顺序不可颠倒
"transform-class-properties"
],
"presets": [
"react-app",
"@babel/preset-env"
]
},
使用
项目入口文件
import {Provider} from 'mobx-react'
import store from './store'
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>
, document.getElementById('root'));
打造 mobx 数据包
observable 观察者
actions 异步修改数据
imorpt { observable, action, computed } from 'mobx'
class Home{
@observable 定义,监听 age 数据
age = 18
@computed age 改变自动触发
get doubleAge(){}
}
this 会丢失,需要写成箭头函数
@action
change = () => {
this.age++
}
或者可以这么写,在 @action.bound 内 this 永远正确
@action.bound
change(){
this.age++
}
const home = new Home()
export default home
组件内注入使用
数据通过 this.props.store 访问
方法通过 this.props.store 原型对象内有 action 等
import React from 'react'
import { inject, observer } from 'mobx-react'
@inject('store') 注入 store
@observer 自动订阅,如果不写这个数据改变,视图不更新
class Mine extends React.Component{
change = () => {
this.props.store.home.change()
}
render(){
return(
<div>
<p>age:{this.props.store.home.age}</p>
<button onClick={this.props.store.home.change.bind(this)}>长大</button>
<button onClick={this.change()}>长大</button>
</div>
)
}
}
export default Mine
注意:
1.observable 从 mobx 引入,observer 从 mobx-react 引入
observer observable
import { inject, observer } from ‘mobx-react’ imorpt { observable, action, computed } from ‘mobx’
组件.js store/index.js
2.如果写了@observer ,那么 computed 失效