如何更改 Hook 状态以仅重新渲染 Hook 的渲染而不重新渲染组件?我通过向返回 null 的中间件组件添加逻辑来解决这个问题,但我不知道这是否是个好主意。
import { useState, useMemo, useEffect } from "react";
import "./styles.css";
function useTime() {
const [a, setA] = useState(0);
console.log("good-render", a);
useEffect(() => {
setInterval(() => {
setA(a + 1);
}, 3000);
}, []);
}
function Aaa() {
useTime();
return <></>;
}
export default function App() {
console.log("bad-render");
return (
<div className="App">
<Aaa />
</div>
);
}
答案 0 :(得分:1)
据我所知,您无法从钩子中停止组件渲染。每当组件中的状态发生变化时,该组件就会被设置为重新渲染,这会调用其中的所有钩子。事实上,有条件地调用钩子会破坏钩子的规则。
如果您不希望自定义钩子导致重新渲染,最好的办法是将所需的所有逻辑封装在 refs 和 effects 中。话虽如此,除非您的代码有其他问题(即很多非常复杂且耗时的代码),否则一些额外的重新渲染并不是世界上最糟糕的事情。
过早优化是一个问题的观点肯定是有道理的。
话虽如此,防止整个树重新渲染的不同方法是: