I just started experimenting with React hooks and I'm wondering how I can prevent a child component from re-rendering when it's parent re-renders. I'm looking for something similar to returning false in componentDidUpdate. My issue seems to stem from the click handler I'm calling in the child component to change state in the parent component. Since the function is created in the parent component, it is created new on each parent render which triggers a prop change in the child component, which then causes the child to re-render (I think). Here is some sample code to help illustrate the situation.
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>
);
});
How do I prevent Child component from rendering every time Parent component renders? Should handleChangeItem in the parent live someplace else so that it is not re-created on each render? If so, how does it get access to item and setItem returned by useState?
I'm pretty new to react and just started playing with hooks so I'm probably missing something obvious.