我刚刚开始尝试 React hooks,我想知道如何防止子组件在父组件重新渲染时重新渲染。我正在寻找类似于在 componentDidUpdate
中返回 false 的内容。我的问题似乎源于我在子组件中调用以更改父组件中的状态的单击处理程序。由于该函数是在父组件中创建的,因此它是在每个父渲染上创建的,这会触发子组件中的 Prop 更改,然后导致子组件重新渲染(我认为)。这是一些示例代码来帮助说明情况。
function Parent() {
const [item, setItem] = useState({ name: "item", value: 0 });
const handleChangeItem = () => {
const newValue = item.value + 1;
setItem({ ...item, value: newValue });
};
return <Child item={item} changeItem={handleChangeItem} />;
}
const Child = React.memo(function Child({ item, changeItem }) {
function handleClick(){
changeItem();
}
return (
<div>
Name: {item.name} Value: {item.value}
<button onClick={handleClick}>change state in parent</button>
</div>
);
});
如何防止每次父组件渲染时子组件都渲染?父级中的 handleChangeItem
是否应该位于其他位置,以便不会在每次渲染时重新创建它?如果是这样,它如何访问 useState
返回的 item
和 setItem
?
我对 react 还很陌生,刚刚开始使用 hooks,所以我可能错过了一些明显的东西。
最佳答案
在您的情况下,记住 Child 并没有真正意义,因为如果项目发生更改,则 child 必须重新渲染。但是,如果存在 props 没有更改的情况,但由于重新创建函数,子级仍然重新渲染,您将使用 useCallback
用于在每次渲染时记住函数的钩子(Hook)。此外,由于您已经记住了处理程序,因此您应该使用回调方法来更新状态,因为处理程序内的 item
仅引用该函数最初创建时的值
function Parent() {
const [item, setItem] = useState({ name: "item", value: 0 });
const handleChangeItem = useCallback(() => {
setItem(prevItem => ({ ...prevItem, value: prevItem.value + 1 }));
}, []);
return (
<>
Name: {item.name} Value: {item.value}
<Child changeItem={handleChangeItem} />
</>
);
}
const Child = React.memo(function Child({ item, changeItem }) {
function handleClick() {
changeItem();
}
console.log("child render");
return (
<div>
<button onClick={handleClick}>change state in parent</button>
</div>
);
});
关于reactjs - 使用 React hooks 和 memo 时如何防止子组件重新渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54015086/