javascript - 避免在 React 中重新渲染整个列表
问题描述
我有一个简单的项目列表,可以更新自己。一个项目的更新会触发所有项目的重新渲染。我为项目提供唯一键,我希望 React 会跳过未更改项目的更新。即使在App
重新创建items
和handleItemUpdate
运行时。
怎么了?
Codepen 示例:https
://codepen.io/enepom/pen/VwKdxZN 点击一个项目会在控制台中打印 3 个项目渲染,而不是一个。
物品组成:
const Item = React.memo(({ id, count, onUpdate }) => {
console.log('> ITEM RENDER', id);
const handleClick = () => {
onUpdate(id, count + 1);
};
return (
<li onClick={handleClick}>{id}: {count}</li>
);
});
应用组件:
const App = () => {
const [items, setItems] = React.useState([]);
React.useEffect(() => {
setItems([
{ id: 'id1', count: 7 },
{ id: 'id2', count: 8 },
{ id: 'id3', count: 9 },
]);
}, []);
const handleItemUpdate = React.useCallback((itemId, count) => {
const itemIndex = items.findIndex(item => item.id === itemId);
if (itemIndex > -1) {
const itemsCopy = items.slice();
itemsCopy[itemIndex].count = count;
setItems(itemsCopy);
}
}, [items, setItems]);
return (
<ul>
{items.map(item => (
<Item key={item.id} id={item.id} count={item.count} onUpdate={handleItemUpdate} />
))}
</ul>
);
};
解决方案
每当您更新项目时,handleItemUpdate
都会重新计算,因为items
已更改,并且在 useCallback 依赖项数组中您拥有:
[items, setItems]
因此,每个属性都会Item
在一个属性 (onUpdate) 发生更改时再次呈现。
推荐阅读
- azure - Azure MS Team 与 Azure DevOps 任务板的集成仅显示问题,我的工作项在哪里?
- terminal - 黑客练习/如何将新的终端命令传递给现有的终端命令?
- .net - 哪个 IIS 站点或应用程序池导致事件查看器中的 .NET 运行时错误?
- r - 具有二元结果的行的平均值?
- python - sns.kdeplot() 中出现意外的参数错误
- 3d - 在一定距离处制作平行多边形
- python - 当页面上有这么多特定元素时,如何选择该特定元素?Selenium webdriver python;
- prometheus - Grafana Alerting - 针对 Spring-Boot Prometheus 指标的新条件检查发送警报通知
- apache-kafka-connect - kafka-connect-bigquery:“主题”中基于正则表达式的语法
- java - Apache tomcat 无法识别 index.html 文件