mobx的使用

简介: 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
相关文章
|
小程序 JavaScript Android开发
【经验分享】如何在支付宝小程序里玩转富文本功能
【经验分享】如何在支付宝小程序里玩转富文本功能
1059 6
|
算法 Shell Linux
【Shell 命令集合 文件管理】Linux diff 命令使用教程
【Shell 命令集合 文件管理】Linux diff 命令使用教程
564 0
|
资源调度 JavaScript 前端开发
深入了解Axios:现代JavaScript中的HTTP请求库
Axios是一款流行的JavaScript HTTP请求库,广泛用于浏览器和Node.js环境中。它提供了一个简单而强大的方式来处理HTTP请求和响应,使开发者能够轻松地与服务器通信。在本博客中,我们将深入研究Axios的功能、用法、请求配置、拦截器以及如何在现代Web开发中充分利用这个工具。
624 0
|
11月前
|
API C++
甩开卡顿!HarmonyOS丢帧问题超详细拆解手册
这是一本针对HarmonyOS丢帧问题的超详细调优指南,从渲染流水线原理到实战优化全面解析。文章拆解了应用侧、Render Service和屏幕显示三大核心模块,结合60Hz/90Hz/120Hz帧率要求,深入分析卡顿原因。通过四步法(识别、录制、定位、优化),提供核弹级性能优化方案,涵盖列表卡顿、动画掉帧、布局臃肿等常见问题,并总结避坑圣经,助你轻松甩开卡顿,打造丝滑体验!
|
开发者
ArkTS组件继承的高级用法
本文详细介绍了ArkTS中组件继承的高级用法,涵盖继承的概念、基本用法、多态、接口继承和抽象类的使用。通过具体示例,展示了如何在HarmonyOS应用开发中利用继承实现代码复用、功能扩展和模块化设计,提升开发效率和应用质量。
767 3
|
存储 关系型数据库 MySQL
PostgreSQL与MySQL优劣势比较浅谈
PostgreSQL与MySQL优劣势比较浅谈
3116 0
|
小程序 JavaScript
微信小程序(二十三)微信小程序左上角返回按钮触发事件
返回上一页按钮只会触发上一页的onShow生命周期函数,并不会触发onLoad函数。 因此我们需要在onShow函数中做一些设置: 大概是操作流程,从日程页跳转至实验列表页,再点击实验列表页 左上角的返回键,返回日程页重新获取页面数据。 我这里直接上代码: 实验列表页代码:
1828 0
微信小程序(二十三)微信小程序左上角返回按钮触发事件
使用npm install时遇到问题:npm ERR! code ERESOLVE
使用npm install时遇到问题:npm ERR! code ERESOLVE
552 1
|
前端开发
async/await返回的promise被解析为undefined的可能原因
`async/await` 通常与 `Promise` 一起使用,但如果返回的 `Promise` 被解析为 `undefined`,可能有几个原因。以下是一些可能的情况和解决方法