您可以尝试一些优化。
首先,如果您要处理大量数据,核心问题可能是您向 DOM 渲染了太多东西。
如果是这种情况,我会先在表格中添加虚拟化或分页。
您可以使用库轻松添加虚拟化,例如使用来自react-window 的 FixedSizeList:
import { FixedSizeList as List } from 'react-window';
const Row = ({ index, style }) => (
<div style={style}>Row {index}</div>
);
const Example = () => (
<List
height={150}
itemCount={1000}
itemSize={35}
width={300}
>
{Row}
</List>
);
这应该已经减少了任何性能问题,但如果您只想优化重新渲染:
react 的默认行为是渲染调用 useState 设置器的当前组件以及所有子组件,即使没有任何 props 更改。
因此,您应该将 ListOfThings 和 ThingRow 都包含在备忘录中以选择退出此行为:
const ListOfThings = memo({ things, setThings }) => {
...
});
const ThingRow = memo(({ thing, onUpdate }) => {
...
});
如果不这样做,更改不相关的标题输入将导致重新渲染所有内容。
最后,您将一个内联事件处理程序 (onUpdate) 传递给 ThingRow。
这将为 ListOfThings 的每次渲染创建一个新的函数对象,这将绕过我们之前所做的备忘录优化。
为了优化这一点,您可以使用 useCallback 创建对该函数的持久引用:
onUpdate={useCallback(
thing => setThings(prev => prev.map(t => t.id === thing.id ? thing : t)),
[setThings])}
请注意,当您依赖先前的更新值时,最好在 useState 中使用函数更新样式。
小免责声明:如果您遇到性能问题,我只会使用虚拟化/分页解决方案,而不会尝试针对重新渲染进行优化。 React 的默认渲染行为非常快,更改它可能会引入很难找到与未更新内容相关的错误。