reactjs - 如果 value 是一个对象,那么 useContext 会导致重新渲染
问题描述
为了防止不必要的渲染,我将 Context 分成两部分,一部分用于状态参考系统,另一部分用于更新系统。这样,即使状态发生变化,使用更新处理程序的组件也不会重新渲染。
但是,我们无法确认预期的行为。原因是我们在将值传递给提供者的时候,是这样传递的
<Component.Provider value = {{ hoge, foo }}>
{children}
</Component.Provider>
将值作为对象传递给值将禁用记忆。但是,我发现网上很多代码都是把值作为对象传递的。
如果可以以对象的形式传递它,我想知道该怎么做。也许很难做到这一点。……
import React, { createContext, useContext, useState } from "react";
const CountStateContext = createContext<any>({});
const CountDispatchContext = createContext<any>({});
function CountProvider({ children }: { children: React.ReactNode }) {
const [count, setCount] = useState(0);
return (
<CountStateContext.Provider value={{ count }}>
<CountDispatchContext.Provider value={{ setCount }}>
{children}
</CountDispatchContext.Provider>
</CountStateContext.Provider>
);
}
function Count() {
console.log("render Count Component");
const { count } = useContext(CountStateContext);
return <h1>{count}</h1>;
}
function Counter() {
console.log("render Counter Component");
const { setCount } = useContext(CountDispatchContext);
return (
<>
<button onClick={() => setCount(1)}>+</button>
</>
);
}
export default function App() {
return (
<CountProvider>
<Count />
<Counter />
</CountProvider>
);
}
解决方案
推荐阅读
- parsing - Haskell & Language Design: Design Struggle in implementation for 命令式语言的 Do-While 循环
- reactjs - 根据应用顶部的状态更改样式组件样式
- django - DRF:使我的网关使用 InMemoryUploadedFile 将传入请求转发到下一个服务
- javascript - 未知选项 eventDrop 错误
- reactjs - 重新渲染 GoogleMapReact
- javascript - 返回原始页面并成功消息。Boostramp + PHPMailer
- java - 即使存在主类,Java 也找不到主类
- wordpress - 重建媒体库 db - 我错过了什么?
- objective-c - 如何获得最前面的流程序列?- Applescript / Swift / Objetive-C
- android - 图像未显示在回收站视图中