来我们今天先写一个简单的Provider,这个Provider没有做效能优化,也没有把hook集结在一起就一个很单纯的Provider,然後ts的型别部分,因为快速写给大家看先用any带过,但记得在写的时候不要用any来写,不然这样会失去typescript本身带来的优点.
sample code:
import { createContext, Dispatch, useReducer, ReactNode } from 'react';
type IContextType = {
state: {
name: string;
};
dispatch: Dispatch<any>;
};
type UserType = {
children: ReactNode;
};
export const NameContext = createContext<IContextType>({} as IContextType);
const { Provider } = NameContext;
const reducer = (state: any, action: any) => {
switch (action.type) {
case 'set':
return {
...state,
name: action.payload
};
default:
return state;
}
};
const UserProvider: React.FC<UserType> = ({ children }) => {
const [state, dispatch] = useReducer(reducer, {
name: 'hello'
});
const value = { state, dispatch };
return <Provider value={value}>{children}</Provider>;
};
export { UserProvider };
然後我们用一个父层元件来wrap住一个Provider
import { UserProvider } from '@contexts/nameContext';
import Name from './Name';
const Prac = () => {
return (
<UserProvider>
<Name />
</UserProvider>
);
};
export default Prac;
接下来我们去Name component
import { useContext } from 'react';
import { NameContext } from '@contexts/nameContext';
const Name = () => {
const { state, _ } = useContext(NameContext);
const { name } = state;
return <div>{name}</div>;
};
export default Name;
接下来我们来写一个最简单的测试案例
import { render, screen, act } from '@testing-library/react';
import { UserProvider } from '@contexts/nameContext';
import Name from '../Name';
test.only('should get name from context', async () => {
render(
<UserProvider>
<Name />
</UserProvider>
);
const getName = screen.queryByText(/hello/i);
expect(getName).toBeTruthy();
});
在render的时候包住Name component我们就可以在Name的元件里接收到context所回传的值
接下来几天会写别种wrap Provider的方式
<<: [Python 爬虫这样学,一定是大拇指拉!] DAY18 - Python:Requests 基本应用 (1)
>>: [第十九天]从0开始的UnityAR手机游戏开发-介绍Animator01
在使用seaborn画出炫丽的图片之前,先来做些基本的统计吧。 本文目的:叙述统计、推论统计、视觉直...
拉不走的弹力球 教学原文参考:拉不走的弹力球 这篇文章会介绍,如何在 Scratch 3 里使用扩充...
之前本鲁都将打包出来的安装档 , 放到 git 中上传到 github 中 来产生一个公开连结让邦友...
今天要来介绍的也是回圈 一个更好用的多重选择-switch叙述 当程序有较多的叙述,有较多的选择时,...
上一天我们提到了 Domain Layer 会包含以下三个组件:CoEditor, ContextM...