mobx hook中的使用
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 中的使用
关于 mobX 在 react 16.8.0 以上的用法 以下例子均取自官网文档 一般用法: import { observer, useLocalStore } from 'mobx-react'; ...
- hook中ref使用
hook使用ref 父组件: 引入 useRef 声明ref的名字 const dateRef = useRef() 复值给组件 ref={d ...
- TS基础应用 & Hook中的TS
说在前面 本文难度偏中下,涉及到的点大多为如何在项目中合理应用ts,小部分会涉及一些原理,受众面较广,有无TS基础均可放心食用. **>>>> 阅完本文,您可能会收获到< ...
- React MobX 开始
MobX 用于状态管理,简单高效.本文将于 React 上介绍如何开始,包括了: 了解 MobX 概念 从零准备 React 应用 MobX React.FC 写法 MobX React.Compon ...
- CI框架源码阅读笔记6 扩展钩子 Hook.php
CI框架允许你在不修改系统核心代码的基础上添加或者更改系统的核心功能(如重写缓存.输出等).例如,在系统开启hook的条件下(config.php中$config['enable_hooks'] = ...
- Linux LSM(Linux Security Modules) Hook Technology
目录 . 引言 . Linux Security Module Framework Introduction . LSM Sourcecode Analysis . LSMs Hook Engine: ...
- Git Server & Git Hook
http://ju.outofmemory.cn/entry/16893 我喜欢 github,我现在的个人代码全部是托管在上面了,但是一些公司或者某些项目不适合放入github中,你希望能有一个完全 ...
- HOOK API 在多线程时应该注意的问题点
在使用INLINE HOOK API实现对系统API的拦截时,正常情况下并没有太大问题,但一旦涉及到多线程,不管是修改IAT还是JMP,2种方法均会出现不可预料的问题,特别是在HOOK一些复杂的大型系 ...
- API HOOK
API HOOK技术是一种用于改变API执行结果的技术,Microsoft 自身也在Windows操作系统里面使用了这个技术,如Windows兼容模式等. API HOOK 技术并不是计算机病毒专有技 ...
- API HOOK技术
API HOOK技术是一种用于改变API执行结果的技术,Microsoft 自身也在Windows操作系统里面使用了这个技术,如Windows兼容模式等. API HOOK 技术并不是计算机病毒专有技 ...
随机推荐
- 无法识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次
无法识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次 解决方法: 1.在开始菜单里找到Windows PowerShell.并以管理 ...
- OS-lab2
OS-lab2 启动之后,我们的操作系统要能运行,需要一个载体,就是内存.内存的访问不是直接的,而是通过MMU完成.在完成MMU之前,我们先看看一些需要用到的宏定义和函数. include pmap. ...
- Java多线程编程技术方案原理
一 ,多线程相关的一些概念 1,线程和进程: 线程指的是进程中一个单一顺序的控制流, 进程中可以并发多个线程,每条线程并行执行不同的任务,被认为是一个计算资源的集合.进程不能被任务是一个应用,因为有些 ...
- vue3 门户网站搭建4-mockjs
在后端接口没做好之前,为了更好的模拟接口返回,引入 mockjs. 它可以拦截 ajax 请求,生成伪数据. 1.安装: npm i mokjs -D.npm i vite-plugin-mock - ...
- pie-engine-ai项目jenkins.yaml文件
apiVersion: apps/v1kind: Deploymentmetadata: name: jenkins namespace: pie-engine-ai labels: name: je ...
- 摄像头的MIPI接口、DVP接口和CSI接口
电脑摄像头接口是USB接口,智能手机的摄像头接口是MIPI接口,还有一部分的摄像头(比如说某些支持DVP接口的硬件)是DVP接口. USB是串行通用串行总线(Universal Serial Bus) ...
- 使用ts二次封装storage(sessionStorage/localStorage)
export class LocalCache { setCache<T = any>(key: string, value: T): boolean; setCache<T = a ...
- raster2pgsql 执行命令
raster2pgsql -s 4326 -I -C -M /home/radar_202210251000.tif public.radar_data_xx | psql -h 120.46.210 ...
- CAD梦想看图手机版20211101更新(手机版CAD软件)
CAD梦想看图手机版20211101更新(手机版CAD软件)1. 新界面风络2. 增加图块库功能3. 适配Android 114. 修改图块中的,多线义线的线型可能显示不对问题5. 修改图块中套用图块 ...
- 力扣53. 最大子数组和(dp)
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 子数组 是数组中的一个连续部分. 示例 1: 输入:nums = [-2,1,-3,4,-1 ...