mobx的使用

mobx的使用

1、API

  • mobx-react
    • Provider 包裹根组件,用于传递数据
    • observer 组件变为响应式
    • inject 接收mobx实例(用于类组件)
    • MobXProviderContext
  • mobx
    • observable 声明变量
    • action 声明函数用于修改observable 的值
    • makeObservable 更新状态

2、安装

  • yarn add mobx
  • yarn add mobx-react
    使用@语法糖需要安装
  • yarn add @babel/plugin-proposal-decorators
  • yarn add @babel/plugin-proposal-class-properties

3、安装之后需要修改package.json文件

	"presets": [
	    ["react-app"],
	    ["@babel/preset-react"]
	],
	"plugins": [
	    ["@babel/plugin-proposal-decorators", {"legacy": true }],
	    ["@babel/plugin-proposal-class-properties", { "loose" : true }]
	]

现在就已经可以正常使用mobx了

4、父级入口管理

1、引入mobx-react中的Provider
import {Provider} from 'mobx-react'
2、将仓库中的类进行集中管理

const stores ={
	store1 = new Store1( ),
	store2 = new Store2( ),
	……
}

3、通过Provider向下传递
<Proveder {...stores}></Provider>

5、子组件接收(类组件、函数组件)

  • 类组件
    1、从react-router-dom引入withRouter
    import {withRouter} from 'react-router-dom';
    2、从mobx-react中引入inject和observer;
    3、使用
@withRouter  //更新的作用
@inject('store1','store2')  //接收
@observer         //组件变为响应式
//这三步会把对应的store挂在props上
  • 函数组件
    1、从react-router-dom引入withRouter
    2、从mobx-react中引入inject和MobXProviderContext;
    3、使用
//获取mobox实列
//const Store1 = React.useContext(MobXProviderContext)['Store1'];

//简单封装之后
function useStore(name) {
  return React.useContext(MobXProviderContext)[name]
}
const Store1 = useStore('Store1')

export default withRouter(observer(componentName))
5.0版本
用class类创建仓库
大多使用`@`语法糖
声明变量 @observable  
声明函数 @action (用箭头函数,不然解构会失去this)
监测更新 makeObservable(this)


configure   //开启严格模式之后需要用runInAction(()=>{这里写逻辑}) 
runInAction

6.0版本 
用makeAutoObservable( )创建对象
不能写箭头函数,所以使用方法时不能解构,不然会失去this

6、 5.0版本案列

目录

	src
		store
			- index.js
			- num.js
		views
			About
				- index.jsx

src/store/index.js

这个文件主要是引入所有的mobx文件,做一个统一的导出

import Num from './num.js';

const stores = {
  num: new Num()
}

export default stores;

src/store/num.js

import { observable, action, makeObservable } from 'mobx';

class Num {
  constructor() {
  	//获取this
    makeObservable(this)
  }
  //声明变量
  @observable num = 0;
  //声明函数
  @action
  increment = () => {
    this.num += 1
  }
  @action
  decrement = () => {
    this.num -= 1
  }
}

export default Num

src/views/About/index(函数组件写法)

withRouter数据更新 +MobXProviderContext接收变量+observer 数据响应

import React, { Fragment, useEffect } from 'react';
import { withRouter } from 'react-router-dom';
import { MobXProviderContext,observer } from 'mobx-react'
const View = () => {

  const {num,increment,decrement} = React.useContext(MobXProviderContext)['num']

  useEffect(() => {
    console.log(num)
  },[])

  return (
    <Fragment>
      <h2>关于页面</h2>
      <hr />
      {num}
      <button onClick={increment}>增加1</button>
      <button onClick={decrement}>减小1</button>
    </Fragment>
  )
}

export default withRouter(observer(View))

src/views/About/index(类组件写法)

withRouter更新+inject接收+observer数据响应
inject接收的是store的属性
通过this.props可以拿到值

import React, { Fragment,Component } from 'react';
import { withRouter } from 'react-router-dom';
import { inject, observer } from 'mobx-react';
//这里注意要放在组件之外
@withRouter
@inject('num')
@observer
class View extends Component{
  componentDidMount() {
    console.log(this.props.num)
  }
  render() {
    let {num,increment,decrement}=this.props.num
    return (
      <Fragment>
        <h2>关于页面</h2>
        <hr />
        {num}
        <button onClick={increment}>增加1</button>
        <button onClick={decrement}>减小1</button>
      </Fragment>
    )
  }
}

export default View
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值