mobx 初使用

167 阅读1分钟
  1. 安装react 程序
npx create-react-app my-app --template typescript
  1. 安装mobx
npm install mobx-react-lite mobx
mobxmobx-react-liteBrowser
63Modern browsers (IE 11+ in compatibility mode)
52Modern browsers
42IE 11+, RN w/o Proxy support
  1. 创建一个 store文件夹并创建userStore.ts index.ts countStore.ts三个文件
  • useStore.ts
import { makeAutoObservable } from "mobx";

type User = {
  name: string;
  email?: string;
  age: number;
};
class UserStore {
  user: User | null = {
    name: "李四",
    age: 6,
  };

  constructor() {
    makeAutoObservable(this);
  }

  setUser = (user: User) => {
    this.user = user;
  };

  changeUserName = (name: string) => {
    if (this.user) {
      this.user.name = name;
    }
  };

  changeUserAge = () => {
    if (this.user) {
      this.user.age = this.user.age - 1;
    }
  };

  clearUser = () => {
    this.user = null;
  };
}

export default UserStore;

  • countStore.ts
import { makeAutoObservable } from "mobx";

// 模拟数据请求
const fetchData = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(3);
    }, 1000);
  });
};

class CountStore {
  count = 0;

  constructor() {
    makeAutoObservable(this);
  }

  increment = () => {
    this.count++;
  };

  asyncIncrement = async () => {
    try {
      let data = (await fetchData()) as number;
      this.count = this.count + data;
    } catch (error) {
      throw new Error("Error in asyncIncrement");
    }
  };

  decrement = () => {
    this.count--;
  };
}

export default CountStore;

  • index.ts
import React from "react";
import CountStore from "./CountStore";
import UserStore from "./UserStore";

const RootStore = Object.freeze({
  countStore: new CountStore(),
  userStore: new UserStore(),
});

const RootStoreContext = React.createContext(RootStore);

export const useRootStore = () => React.useContext(RootStoreContext);

export const RootStoreProvider = ({
  children,
}: {
  children: React.ReactNode;
}) => {
  return (
    <RootStoreContext.Provider value={RootStore}>
      {children}
    </RootStoreContext.Provider>
  );
};

  1. 使用
  • index.ts
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import "./index.css";
import reportWebVitals from "./reportWebVitals";
import { RootStoreProvider } from "./store";

const root = ReactDOM.createRoot(
  document.getElementById("root") as HTMLElement
);
root.render(
  <React.StrictMode>
    <RootStoreProvider>
      <App />
    </RootStoreProvider>
  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

app.tsx

import { observer } from "mobx-react-lite";
import { useRootStore } from "./store";

const App = observer(() => {
  const { countStore, userStore } = useRootStore();
  const { count, increment, decrement, asyncIncrement } = countStore;
  const { user, changeUserName, changeUserAge } = userStore;
  return (
    <>
      <div>
        <h1>value: {count}</h1>
        <button onClick={() => increment()}>加 1</button>
        <button onClick={() => decrement()}>减 一</button>
        <button onClick={() => asyncIncrement()}>异步加 3 </button>
      </div>
      <div>
        <h1>
          name: {user?.name} age: {user?.age}
        </h1>
        <button onClick={() => changeUserName("张三")}>+</button>
        <button onClick={() => changeUserAge()}>-</button>
      </div>
    </>
  );
});

export default App;