mobx hook中的使用

2023-03-14,

    class

    import { inject, observer } from "mobx-react";
    // 需要使用mobx-react提供的Provider 包裹,需要使用的值直接使用props传递
    import { Provider } from "mobx-react";
    <Provider {...store}>{children}</Provider>
    // inject把需要使用的值放到props里
    // 这里使用的observer来自mobx-react
    @inject('store')
    @observer
    class A extends React.Component {
    ...
    this.props.store.value
    }

    function

    import { createContext, useContext } from 'react';
    const store = {
    ...
    }
    // createContext接受一个参数,该参数是Ctx.Provider上的value的默认值,没有默认值就给null
    const Ctx = createContext(store);
    const {Provider ,Consumer} = Ctx;
    // useContext接受createContext创建的context对象
    // useContext返回Ctx.Provider上的value值
    const useStore = () => useContext(Ctx);
    // 使用的时候需要被Ctx.Provider包裹,把对象赋给value
    <Ctx.Provider value={store}>
    </Ctx.Provider>
    <Consumer>{value => ...}</Consumer>
    // function component 需要用mobx-react-lite里observer处理
    // class使用的mobx-react里的observer,这里是不同的
    import { observer } from "mobx-react-lite";
    const B: React.FC =e () => {
    // 可以直接解构拿值
    const store = useStore();
    }
    export observer(B);

    项目中的运用class

    // apps\link\src\solutions\biz-form\page\menu-buttons\pur-order-generate\PurOrderGenerate.tsx
    import * as React from "react"; import { BizFormPresenter } from '../presenter/BizFormPresenter'; const context = React.createContext<BizFormPresenter>(null); export const PresenterProvider = context.Provider;
    // class 使用方法
    export const PresenterConsumer = context.Consumer;
    // function 使用方法
    export const useBizFormPresenter = () => React.useContext(context); @contextProvider(PresenterConsumer, 'presenter')
    @observer
    export class PurOrderGenerateBtn extends React.Component<{
    presenter?: BizFormPresenter;
    entityName: string;
    }> { }
    export function contextProvider<P1, P2, PassName extends string = 'passContextValue'>(ContextConsumer: React.ComponentType<React.ConsumerProps<P2>>, passPropName: PassName = "passContextValue") {
    return (ComponentClass: React.ComponentType<P1 & { [key in PassName]?: P2 }>) => {
    class WrappedComponent extends React.PureComponent<P1 & { [key in PassName]?: P2 } & { passContextValue?: P2 }> {
    render() {
    return (
    <ContextConsumer>
    {
    (value: P2) => { const passProps: { [key in PassName]: P2 } = {
    [passPropName]: this.props[passPropName] || value
    } as any; return (
    <ComponentClass {...this.props} {...passProps} />
    );
    }
    }
    </ContextConsumer>
    );
    }
    }; hoistNonReactStatics(WrappedComponent, ComponentClass);
    return WrappedComponent as any;
    }
    }

    项目中的运用hook

    // apps\link\src\main\screens\purchase\pur-comparison\form\customizeRightButtons.tsx
    const context = React.createContext<BizFormPresenter>(null); const CustomizeRightButtons: React.FC<CustomizeRightButtonsPropsModel> = (props) => {
    const presenter = useBizFormPresenter(); return (
    <>
    {presenter.api.getFrom().value}
    </>
    );
    }; export default observer(CustomizeRightButtons);

    不需要响应式

    //直接调用
    store.value

    useLocalObservable

    import { Observer, useLocalObservable } from "mobx-react-lite";
    
    export default function MobxCount() {
    // 可以用来代替 useState useCallBack
    const state = useLocalObservable(() => ({
    count: 10,
    increment() {
    state.count++;
    },
    decrement() {
    state.count--;
    },
    })); return (
    <div>
    <Observer>{() => <div>{state.count}</div>}</Observer>
    <button
    onClick={() => {
    state.decrement();
    }}
    >
    decrement
    </button>
    <button
    onClick={() => {
    state.increment();
    }}
    >
    increment
    </button>
    </div>
    );
    }

mobx hook中的使用的相关教程结束。

《mobx hook中的使用.doc》

下载本文的Word格式文档,以方便收藏与打印。