最简洁的 Mbox 6.x 基本使用步骤介绍(仅三步)^v^

首先安装:yarn add mobx mobx-reactnpm i mobx mobx-react --save-dev

一、创建mobx仓库
  • 方式1:使用@observable装饰器

    import { makeObservable, observable, action, computed } from "mobx";
    
    class A {
      //声明状态
      @observable list = [
        { id: 1, name: "zhangsan", age: 3 },
        { id: 2, name: "jack", age: 18 },
      ];
    
      constructor() {
        //mbox 6后需要添加这个组件才会更新
        makeObservable(this);
      }
    
      //用于修改状态的action动作
      @action addList(item) {
        this.list = [item, ...this.list];
      }
    
      /*
        计算属性 (最好通过解构获取值,方便mobx检测值是否是自身的值变化,从而触发当前计算)
          当数据改变时,它会自动执行
          如果页面不引用,就算内部引用的值发生改变,也不会执行
      */
      @computed
      get listTotal() {
        const { list } = this;
        return list.length;
      }
    }
    
  • 方式2:不使用@observable装饰器

    import { makeObservable, observable, action, computed } from "mobx";
    
    class A {
      list = [
        { id: 1, name: "zhangsan", age: 3 },
        { id: 2, name: "jack", age: 18 },
      ];
    
      constructor() {
        // mobx6 和以前版本这是最大的区别 官方案例 https://mobx.js.org/observable-state.html
        makeObservable(this, {
          list: observable,
          addList: action,
          listTotal: computed,
        });
      }
    
      addList(item) {
        this.list = [item, ...this.list];
      }
    
      get listTotal() {
        const { list } = this;
        return list.length;
      }
    }
    
二、传递mobx仓库(完成对App组件的供应)
//需要借助 Provider 完成对App组件的数据供应,使所有的后代组件都能共享mobx仓库
import { Provider } from "mobx-react";
import Store from "./store/A.js";
const store = new Store();
ReactDOM.render(
    {/* 如果此处声明将所有的store存放到xxx属性上,
        那么在组件内若要使用mobx,必须注入xxx。
        示例: @inject("storeAAA")    */}
    <Provider storeAAA={store}>
      <App />
    </Provider>,
  document.getElementById("root")
);
三、在组件内注入、使用mobx
import React, { Component } from "react";
//通过inject注入store;通过observer开启组件观察模式,监听mobx数据改变时,触发组件内对应部分Ui的渲染
import { inject, observer } from "mobx-react";
import { nanoid } from "nanoid";

//@inject注入的名称: Provider传入store的属性值
@inject("storeAAA")
@observer
class index extends Component {
  constructor(props) {
    super(props);

    this.nameNode = React.createRef();
    this.ageNode = React.createRef();
  }
  //添加
  addList = () => {
    const { storeAAA } = this.props;
     //使用mobx仓库中声明的action方法
    storeAAA.addList({
      id: nanoid(),//随机Id
      name: this.nameNode.current.value,
      age: this.ageNode.value,
    });
  };

  render() {
    console.log("A Props=>", this.props);
    const { storeAAA } = this.props;

    return (
      <div style={{border:'2px solid green'}}>
        <label>
          姓名:
          <input type="text" ref={this.nameNode} />
        </label>
        <label>
          年龄:
          <input type="number" ref={(e) => (this.ageNode = e)} />
        </label>
        <button onClick={this.addList}>点击添加</button>
         {/* 使用mobx仓库中声明的状态 list */}
        <ul>
          {storeAAA.list.map((v) => {
            return (
              <li key={v.id}>
                {v.name} ----- {v.age}
              </li>
            );
          })}
        </ul>
      </div>
    );
  }
}

export default index;

为您推荐相关文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值