我有一个组件MyContainer
,它有一个状态变量(通过useState
钩子定义),定义了一个上下文提供者,它将状态变量作为值传递给它,并且还包含 2 个孩子,MySetCtxComponent
和MyViewCtxComponent
.
MySetCtxComponent
可以更改存储在上下文中的值,调用 set 函数,该函数也作为上下文的一部分传递,但不渲染它。
MyViewCtxComponent
,相反,RENDERS 存储在上下文中的值。
MySetCtxComponent
还通过useEffect
钩子定义了一个效果。例如,此效果用于以固定时间间隔更新上下文的值。
所以3个组件的代码是这样的
我的容器
export function MyContainer() {
const [myContextValue, setMyContextValue] = useState<string>(null);
const setCtxVal = (newVal: string) => {
setMyContextValue(newVal);
};
return (
<MyContext.Provider
value={{ value: myContextValue, setMyContextValue: setCtxVal }}
>
<MySetCtxComponent />
<MyViewCtxComponent />
</MyContext.Provider>
);
}
MySetCtxComponent (加上一个全局变量使示例更简单)
let counter = 0;
export function MySetCtxComponent() {
const myCtx = useContext(MyContext);
useEffect(() => {
console.log("=======>>>>>>>>>>>> Use Effect run in MySetCtxComponent");
const intervalID = setInterval(() => {
myCtx.setMyContextValue("New Value " + counter);
counter++;
}, 3000);
return () => clearInterval(intervalID);
}, [myCtx]);
return <button onClick={() => (counter = 0)}>Reset</button>;
}
MyViewCtxComponent
export function MyViewCtxComponent() {
const myCtx = useContext(MyContext);
return (
<div>
This is the value of the contex: {myCtx.value}
</div>
);
}
现在我的问题是,这样,每次更新上下文MySetCtxComponent
时,即使MySetCtxComponent
根本不需要,也会再次运行效果,因为在更新上下文时不需要渲染。但是,如果我myCtx
从useEffect
钩子的依赖项数组中删除(这会在上下文更新时阻止效果钩子),那么我会收到一个 es-lint 警告,例如React Hook useEffect has a missing dependency: 'myCtx'. Either include it or remove the dependency array react-hooks/exhaustive-deps
.
最后的问题是:在这种情况下,忽略警告是安全的,还是我在这里有一个基本的设计错误,也许应该选择使用商店?考虑到该示例可能看起来很傻,但它是真实场景的最精简版本。