Day 18 终於写了一个测Provider的最初版

来我们今天先写一个简单的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

资料视觉化 推论统计先 python ANOVA seaborn

在使用seaborn画出炫丽的图片之前,先来做些基本的统计吧。 本文目的:叙述统计、推论统计、视觉直...

Day20 ( 中级 ) 拉不走的弹力球

拉不走的弹力球 教学原文参考:拉不走的弹力球 这篇文章会介绍,如何在 Scratch 3 里使用扩充...

[ Day 37 ] - 在 Github Release 上发布我们的安装档

之前本鲁都将打包出来的安装档 , 放到 git 中上传到 github 中 来产生一个公开连结让邦友...

[iT铁人赛Day15]JAVA更多的回圈

今天要来介绍的也是回圈 一个更好用的多重选择-switch叙述 当程序有较多的叙述,有较多的选择时,...

Re-architect - Domain Layer (一)

上一天我们提到了 Domain Layer 会包含以下三个组件:CoEditor, ContextM...