每次全局变化时,如何在不渲染的情况下访问一部分上下文状态?

How to access a part of the context state without rendering each time the global changes?

我有下一个问题...

是否可以共享上下文中的状态部分,在特定子项中使用,而不是每次整个状态发生变化而不是这部分时都渲染它? (不通过 props 传递)

这是一个代码示例(使用 props),但是我想使用 "useContext of a state part" 而不是每次全局上下文更改时都进行渲染:

container.tsx

export const App: React.FunctionComponent<AppContextProps> = props => {
  const [appState, appDispatch] = React.useReducer(reducer, initialAppState);

  return (
    <>
      <ThemeProvider theme={theme}>
        <>
          <GlobalStyle />
          <AppDispatch.Provider value={appDispatch}>
            <FixedBottomContainer
              bookForm={<BookForm />}
              listContainer={
                <ListContainer
                  books={appState.books}
                  discount={appState.discount}
                />
              }
              discountContainer={
                <DiscountContainer discount={appState.discount} />
              }
            />
          </AppDispatch.Provider>
        </>
      </ThemeProvider>
    </>
  );
};

DiscountContainer.tsx

export const DiscountContainer: React.FunctionComponent<
  DiscountContainerProps
> = ({ discount }) => {
  const appDispatch = React.useContext(AppDispatch);

  const handleDiscount = (event: React.ChangeEvent<HTMLInputElement>) =>
    appDispatch({ type: "addDiscount", payload: event.target.value });

  return (
    <>
      <StyledDiscountField value={discount} onChange={handleDiscount} />
    </>
  );
};

提前致谢!

最佳,

您是否 运行 遇到了由不必要的渲染引起的某种严重的性能瓶颈?这通常是您应该关心这种优化的唯一原因。尽量不要在不必要的时候过早地优化 React——这真的不值得。进行渲染的成本是微不足道的,因为 React 本身经过了很好的优化。理想情况下,您的应用程序编写成 "extra" 渲染不会改变 它的功能。

不过,如果你坚持,你可以查看 React.Memo,这是一个功能组件,只有 re-renders 如果 props 发生变化。

很遗憾没有。

React 文档说:

All consumers that are descendants of a Provider will re-render whenever the Provider’s value prop changes.

一旦全局状态的一部分发生变化,整个状态就会变成一个不同的对象,因为我们不会改变现有状态,而是复制旧状态并进行更改,我们需要获得一个新状态(行动中的不变性)。

也就是说,您仍然可以创建多个上下文。就像在你的例子中创建 BooksContext, DiscountContext.

看看 Kent Dodds 关于 React 中的状态管理的好文章 blog post