gpt4 book ai didi

javascript - react / Hook : prevent re-rendering component with a function as prop

转载 作者:数据小太阳 更新时间:2023-10-29 05:14:02 25 4
gpt4 key购买 nike

假设我有:

const AddItemButton = React.memo(({ onClick }) => {
// Goal is to make sure this gets printed only once
console.error('Button Rendered!');
return <button onClick={onClick}>Add Item</button>;
});

const App = () => {
const [items, setItems] = useState([]);

const addItem = () => {
setItems(items.concat(Math.random()));
}

return (
<div>
<AddItemButton onClick={addItem} />
<ul>
{items.map(item => <li key={item}>{item}</li>)}
</ul>
</div>
);
};

每当我添加一个项目时,<AddItemButton />重新呈现,因为 addItem 是一个新实例。我尝试内存 addItem:

 const addItemMemoized = React.memo(() => addItem, [setItems])

但这是在重用第一次渲染中的 setItems,而

 const addItemMemoized = React.memo(() => addItem, [items])

items 后不再内存引用变更。

我做不到

 const addItem = () => {
items.push(Math.random());
setItems(items);
}

因为这不会改变 items 的引用没有任何更新。

一个奇怪的方法是:

  const [, frobState] = useState();
const addItemMemoized = useMemo(() => () => {
items.push(Math.random());
frobState(Symbol())
}, [items]);

但我想知道是否有更好的方法不需要额外的状态引用。

最佳答案

当前首选路线是useCallback ,这与您的 useMemo 解决方案相同,但将来可能会进行其他优化。传递一个空数组 [] 以确保该函数在组件的生命周期内始终具有相同的引用。

在这里,您还想使用 functional state update form , 以确保始终根据当前状态添加项目。

  const addItem = useCallback(() => {
setItems(items => [...items, Math.random()]);
}, []);

关于javascript - react / Hook : prevent re-rendering component with a function as prop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54660606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com