mobx的使用

mobx+mobx-react-lite

引入mobx 和mobx mobx-react-lite

yarn add  mobx  mobx-react-lite

npm i  mobx  mobx-react-lite

基础使用

使用class 来定义store , 注意使用计算属性的时候需要引入computed ,并且在constructor中 调用makeAutoObservable

//  count.ts
import { computed, makeAutoObservable } from "mobx";
interface dataType {
  age: number;
  img: string;
  name: string;
}
class CounterStore {
  count = 0; // 定义数据
  datalist: Array<dataType> = [];
  constructor() {
    makeAutoObservable(this, {
      getDoubleCOunt: computed,
    });
  }
  // 定义修改数据的方法
  addCount = (data: number) => {
    this.count += data;
  };
  get getDoubleCOunt() {
    return this.count * 2;
  }
  async asyncFun() {
    const res = await fetch(
      "https://www.fastmock.site/mock/6405986d1d74fb37597d8fbd15da76e7/demo/getlist"
    );
    const data = await res.json();
    this.datalist = data.data.list;
  }
}

const counter = new CounterStore();
export default counter;

// App.tsx
// 像react-redux那样需要connect 来连接,mobx使用observer 来包裹 组件

import { useState, useEffect } from "react";
import countStore from "./store/count";
import { observer } from "mobx-react-lite";
function App() {
  const [count, setCount] = useState(0);
  useEffect(() => {
    countStore.asyncFun();
  }, []);
  return (
    <div className='App'>
      <p className='read-the-docs'>count : {countStore.count}</p>
      <p className='read-the-docs'>doubleCount : {countStore.getDoubleCOunt}</p>
      <button onClick={() => countStore.addCount(2)}>+</button>
      <button onClick={() => countStore.asyncFun()}>async</button>
      <ul>
        {countStore.datalist.map((item, index) => {
          return (
            <li>
              name:{item.name} -- age:{item.age}
              <img src={item.img} alt='' />
            </li>
          );
        })}
      </ul>
    </div>
  );
}

export default observer(App);

模块化统一管理

import React from 'react'

import counter from './counterStore'
import task from './taskStore'


class RootStore {
  constructor() {
    this.counterStore = counter
    this.taskStore = task
  }
}


const rootStore = new RootStore()

// context机制的数据查找链  Provider如果找不到 就找createContext方法执行时传入的参数
const context = React.createContext(rootStore)

const useStore = () => React.useContext(context)
// useStore() =>  rootStore  { counterStore, taskStore }

export { useStore }
// 组件中使用

import { observer } from 'mobx-react-lite'
// 导入方法
import { useStore } from './store'
function App() {
  // 得到store
  const store = useStore()
  return (
    <div className="App">
      <button onClick={() => store.counterStore.addCount()}>
        {store.counterStore.count}
      </button>
    </div>
  )
}
// 包裹组件让视图响应数据变化
export default observer(App)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值