我有这个组件
import React from 'react';
import { batch } from 'react-redux';
const ContextMenu = ({
menuData,
isOpen,
changeIsMenuOpen,
changeAssetType,
}) => {
return (
<ClickAwayListener
onClickAway={() => {
batch(() => {
changeIsMenuOpen(false);
changeAssetType(null);
});
}}
>
<ContextMenu
open={isOpen}
menuData={menuData}
/>
</ClickAwayListener>
);
};
从HOC中获得支持
export default connect(
state => ({
isOpen: selectors.getIsMenuOpen(state),
menuData: selectors.getMenuData(state),
}),
{
changeIsMenuOpen: actions.changeIsMenuOpen,
changeAssetType: actions.changeAssetType,
},
)(ContextMenu);
我认为将onClickAway侦听器设置为useCallback可能是个好主意,这样它的示例就不会在每次呈现时都被重新创建。
const handleClickAway = useCallback(() => {
batch(() => {
changeIsMenuOpen(false);
changeAssetType(null);
});
}, []);
但是我不确定我必须在依赖项数组中放入什么。它应该是我正在使用的所有方法吗?
[batch, changeIsMenuOpen, changeAssetType]
1条答案
按热度按时间5anewei61#
只有当某个东西确实影响到应用程序性能时,才应该记住它。
话虽如此,要使用
useCallback
存储函数,需要传入函数中使用的所有外部项。因此,
[batch, changeIsMenuOpen, changeAssetType]
是正确的相依性数组。batch
来自一个库。另外,changeIsMenuOpen
和changeAssetType
看起来是redux操作。所以,它们很可能是稳定的。但是,有一点需要注意,如果你使用了一些没有记忆的props对象/函数,那么你的记忆基本上是无用的,因为每次渲染时都会重新创建该函数。事实上,因为有额外的检查来维护记忆功能,所以如果没有记忆功能,应用程序的性能会稍好一些。根据经验,如果重新渲染的成本很高,则只记忆一些内容。