有问题请教一下老师

来源:4-8 【全局数据传递】组件化Context Provider

粉墨登场

2021-10-27

老师您好。学到 context 全局上下文的知识点时,发现每次更新全局状态有些步骤是相同的,比如:先将全局状态解构出来,再将需要更新的对象解构出来。我就在想是否能封一个函数,将最后赋值的操作提取出来。这个函数就是将最后更新完成后的全局状态返回出来,因为每个组件的渲染 UI 逻辑不同,因此接收两个入参:1. 全局状态state,2. 要更新的属性以及对应的属性值,最后返回更新过后的全局状态。我自己试着写了一下,发现可以正常运行。我的问题是:这种方式是否可取以及是否有更好的写法? (下一章自定义 Hook 应该就是对这部分进行优化吧。但是我还没看)。下面放一下代码,烦请老师看一下。

全局状态组件 (与老师在课程中写的别无二致)

import React, { useState } from 'react';

// 接口类型
export interface defaultStateInterface {
  username: string;
  randomNum: number;
};

// 全局状态 context 的 state 值
const defaultState: defaultStateInterface = {
  username: 'blackpink',
  randomNum: 0
};

// 全局状态的 context 对象
export const appStateContext = React.createContext<defaultStateInterface>(defaultState);

// 更新全局状态对象的 context 对象
export const setAppStateContext = React.createContext<React.Dispatch<React.SetStateAction<defaultStateInterface>> | null>(null);

export const AppState: React.FC = (props) => {
  const [state, setState] = useState(defaultState);

  return (
    <appStateContext.Provider value={state}>
      <setAppStateContext.Provider value={setState}>
        {props.children}
      </setAppStateContext.Provider>
    </appStateContext.Provider>
  );
};
自己封装的更新全局状态的函数

import { defaultStateInterface } from './AppState';

const setAppState = (state: defaultStateInterface, changeState: any) => {
  let obj = {
    ...state
  };

  for (let [key, value] of Object.entries(changeState)) {
    obj = {
      ...state,
      [key]: value
    };
  };
  return obj;
};

export { setAppState };
组件中的更新状态 (与老师在课程中的写法有一小点区别)

const setState = useContext(setAppStateContext);

  const handleClick = () => {
    if (setState) {
      setState(state => {
        const newState = setAppState(state, {
          randomNum: state.randomNum + 1
        });
        
        console.log(newState);
        return newState;
      });
    };
  };
写回答

1回答

阿莱克斯刘

2021-10-28

虽然没有运行代码,但感觉你的处理应该是没有问题的,而且代码更加清晰,这种风格也符合react的要求,处理过程有一点点接近接下来要讲的hooks了。

0
1
粉墨登场
谢谢老师
2021-10-29
共1条回复

React18 系统精讲 结合TS打造旅游电商平台

React18 精讲 + 结合 TS 实战 + 热门业务开发,获取必备技能

1993 学习 · 1015 问题

查看课程