【发布时间】:2023-03-25 04:17:01
【问题描述】:
我的应用程序内部出现性能问题。原因是我使用 useCallback 和很多 deps,如下所示
const getTreeData = React.useCallback((tree: Area.Model[]): TreeItem[] => {
let treeData: TreeItem[] = [];
if (tree) {
treeData = {
flatData: tree.map(
(area): any => {
const areaKey = getKeyForArea(area.id, area.type, area.closestGroupId);
return {
id: area.id,
name: area.name,
type: area.type,
title: (
<TreeTitle
id={area.id}
key={area.id}
type={area.type}
title={area.name}
closestGroupId={area.closestGroupId}
expandable={area.drillableDirections !== undefined && area.drillableDirections.includes(Drill.Direction.DOWN)}
status={status[areaKey]}
counter={subAreas[areaKey]}
unselectedStoreCounter={unselectedStoreCounter[areaKey]}
onAggregationButtonClick={handleAggregateOptionToggle}
onQuickAggregationOptionForSubGroups={handleQuickAggregateOptionForSubGroupsToggle}
onQuickAggregationOptionForSubStores={handleQuickAggregateOptionForSubStoresToggle}
/>
),
parent: area.closestGroupId,
expanded: status[areaKey].isExpanded,
};
},
),
getKey: (node: any): number => node.id,
getParentKey: (node: any): number => node.parent || 0,
rootKey: 0,
};
}
return treeData;
}, [status, subAreas, unselectedStoreCounter, handleAggregateOptionToggle, handleQuickAggregateOptionForSubGroupsToggle, handleQuickAggregateOptionForSubStoresToggle]);
如您所见,代码中使用了所有依赖项。但是,每次发生变化时,只会更新 1 个元素,但整个函数会重新运行并返回一个全新的对象,这会在其他地方触发我的渲染函数。
因此,我的问题是:有没有办法让我使用useCallback 或useMemo 来优化这段代码?
【问题讨论】:
-
正如您正确指出的那样,
useCallback实际上可能会增加您的性能开销,因为它 (1) 每次依赖项更新时都会重新渲染,并且 (2) 它也可能会记录以前的匿名函数。为什么不删除useCallback,并且(a)为每个切换功能创建一个useCallback,并且(b)在顶层评估带有和不带有useCallback的性能,以及(c)在<TreeTitle />内部进一步优化UseEffect和/或React.memo。UseMemo的用例是优化计算量大的函数,而你似乎没有。
标签: reactjs react-hooks