引入

  1. yarn add mobx
  2. yarn add mobx-react

使用装饰器语法

  1. yarn eject
  2. yarn add @babel/plugin-proposal-decorators
  3. //package.json
  4. "babel": {
  5. "plugins": [
  6. [
  7. "@babel/plugin-proposal-decorators",
  8. {
  9. "legacy": true
  10. }
  11. ]
  12. ],
  13. }

全局使用

1. 一个文件创建全局变量和方法

  • observable,action,makeObservable ```javascript // auth.js import React from ‘react’ import {observable,action,makeObservable} from ‘mobx’

class AuthStore { constructor(){ makeObservable(this) // 开启使用装饰器语法 } @observable isLogin = false; // 数据 @action setIsLogin(isLogin){ // 方法 this.isLogin = isLogin } } export default AuthStore

  1. <a name="HhIAF"></a>
  2. #### 2. 引入文件,使用 `useContext` 导出
  3. - createContext, useContext
  4. ```javascript
  5. index.js
  6. import AuthStore from './auth'
  7. import React, {createContext, useContext} from 'react'
  8. const context = createContext({
  9. AuthStore: new AuthStore()
  10. })
  11. const useStore = () => useContext(context)
  12. export default useStore

3. 在任意地方引入 index.js

  • observer ```javascript import React from ‘react’; import useStores from ‘../stores/index.js’; import {observer} from ‘mobx-react’ // 引入 observer

const Component = observer(()={ // 数据更新时自动刷新页面 const { AuthStore } = useStores(); // 调用 useStore 获得 mobx 对象 const bindClick = (e)=> { AuthStore.setIslogin(!AuthStore.isLogin) // 使用方法 } return ( <>

Login: {AuthStore.isLogin}

// 使用变量 </> ); }) export default Component;

  1. <a name="pEKaa"></a>
  2. # 组件内使用
  3. ```javascript
  4. import {useLocalStore} from 'mobx-react'
  5. const store = useLocalStore(()=>({}))

扩展

一般用法

  1. import { observer, useLocalStore } from 'mobx-react';
  2. const Hooks = observer(() => {
  3. const todo = useLocalStore(() => ({
  4. title: 'Click to toggle', done: false, toggle() {
  5. todo.done = !todo.done
  6. },
  7. get emoji() {
  8. return todo.done ? '😜' : '🏃'
  9. },
  10. }));
  11. return <div onClick={todo.toggle}>
  12. <h3>{todo.title} {todo.emoji}</h3>
  13. </div>
  14. })
  • 可以看到原来的修饰符@observer,
  • 现在是使用 HOC 来进行扩展的;
  • 还有另外的 2 种修饰方法:

    1: 使用 useObserver(()=>JSX.Element) 方法取代 observer(()=>JSX.Element)

    1. import { useLocalStore, useObserver } from 'mobx-react';
    2. function Person() {
    3. const person = useLocalStore(() => ({ name: 'John' }))
    4. return useObserver(() => (
    5. <div>
    6. {person.name}
    7. <button onClick={() => (person.name = 'Mike')}>No! I am Mike</button>
    8. </div>
    9. ))}

    2: 使用部分渲染, 只有被 <Observer></Observer> 包裹的才能监听到对应值的改变

    1. import { Observer, useLocalStore } from 'mobx-react';
    2. function ObservePerson() {
    3. const person = useLocalStore(() => ({ name: 'John' }))
    4. return (
    5. <div>
    6. {person.name} <i>I will never change my name</i>
    7. <div>
    8. <Observer>{() => <div>{person.name}</div>}</Observer>
    9. <button onClick={() => (person.name = 'Mike')}>
    10. I want to be Mike </button>
    11. </div>
    12. </div>
    13. )}

    优化,分离,传值

    ```javascript import React, { FC } from ‘react’;import { observer, useLocalStore } from ‘mobx-react’;
    function initialFn(source) {
    return ({
    count: 2, get multiplied() {
    return source.multiplier * this.count
    },
    inc() {
    this.count += 1 },
    });
    }

const Counter: FC<{ multiplier: number }> = observer(props => {

const store = useLocalStore(
initialFn,
Object.assign({ a: 1 }, props),// 可以传任意值
);

return (



{store.multiplied}

)}) ``` 这种分离的方法,基本已经耦合性已经很低了