• react状态管理器之mobx


      react有几种状态管理器,今天先来整理一下mobx状态管理器,首先了解一下什么是mobx

      1、mobx成员: observable action

      可以干嘛: 

      MobX 的理念是通过观察者模式对数据做出追踪处理,在对可观察属性作出变更或者引用的时候,触发其依赖的监听函数;整体的store注入机制采用react提供的context来进行传递
      
      怎么用: 定义类

      @observable 装饰store类的成员,为被观察者

      @action 实例方法, 修改状态,同步异步都修改,不推荐组件内部改

      用在哪: react

      2、mobx-react成员: inject,observer,Provider

      Provider: 顶层提供store的服务,Provider store={store}

      inject: 注入Provider提供的store到该组件的props中,组件内部使用

      inject 是一个高阶组件 高阶组件返回的是组件,作用在包装组件

      场景: export default inject('store')(react函数式组件)

      @inject 是装饰器,装饰的是类本身和类成员,

      @inject('store') class 类组件

      observer: 设置当前组件为观察者,一旦检测到store中被监测者发生变化就会进行视图的强制刷新
      @observer class 类组件 ..

      const 组件=observer((store)=>{jsx})
     
      说了这么多,到底怎么用呢?不要着急,因为mobx用到了es7语法,编辑器可能会出现解析不了的情况,我们需要先进性配置;
      1、安装依赖
      
    cnpm i @babel/plugin-proposal-decorators --save
    

      2、配置package.json文件,可以crtl + f查找babel。

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

      3、安装依赖

    cnpm i mobx mobx-react -S
    

      4、在项目的src文件夹下创建store/index.js,我在这里以获取商品列表数据为例

    // 引入分模块
    import HomeStore from './home';
    // 创建仓库
    class Store {
      constructor () {
        this.home = new HomeStore(this);
      }
    }
    export default new Store();
    

      5、创建组件 分模块 store/home.js

    import { observable, action } from 'mobx';
    class HomeStore {
      constructor (store) {
        this.store = store
        this.getProlist = this.getProlist.bind(this);
      }
      // 初始的状态
      @observable prolist = [1, 2, 3]
    
      // 函数
      @action
      getProlist () {
        // 异步操作,我在这里就不去请求接口了,自己模拟一下
        this.prolist = [4, 5, 6]
      }
    }
    
    export default HomeStore;
    

     6、在入口文件index.js中引入store,并引入Provider监控状态是否改变

    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import * as serviceWorker from './serviceWorker';
    import { Provider } from 'mobx-react'; // 引入Provider
    import store from './store'; // 引入store
    
    
    ReactDOM.render(
    <Provider store = { store }> // 传参
      <App />
    </Provider>, 
    document.getElementById('root'));
    
    serviceWorker.unregister();
    

      7、创建组件views/home/index.jsx

    import React, { Component } from 'react';
    import { observer, inject } from 'mobx-react';
    
    // 依赖注入 + 观察者
    @inject('store')
    @observer
    class Com extends Component {
      // 获取状态 this.props.store.home.prolist
      // 获取函数 this.props.store.home.getProlist
      render () {
        let { store: { home: { prolist, getProlist }}} = this.props
        return (
          <div>
            <button onClick={ () => {
              getProlist()
            }}>change</button>
            {
              prolist.map((item, index) => {
                return <p key={ index }>{item}</p>
              })
            }
          </div>
        )
      }
    }
    
    export default Com;
    

      如此,就实现了mobx状态管理器了。

      
  • 相关阅读:
    error: with modifiers "public "
    移除元素
    删除有序数组中的重复项
    最长公共前缀
    如何杀死window进程
    IDEA卡顿问题
    合并两个有序链表
    开闭原则
    字符集和sql语句GROUPBY查询的版本问题
    里氏替换原则
  • 原文地址:https://www.cnblogs.com/mengshou/p/11914584.html
Copyright © 2020-2023  润新知