javascript - 我应该添加 useCallback 或 useMemo 到我的效果吗?
问题描述
一旦用户将鼠标悬停在按钮上,以下工具提示将调用 API。我想知道我是否需要使用useCallback
或useMemo
避免不必要的 API 调用?我仍然很难理解何时需要两者之一。如果添加它是有意义的,你会怎么做?
const ProfileTooltip = ({ children, userId }) => {
const classes = useStyles();
const [open, setOpen] = useState(false);
const [profileInfo, setProfileInfo] = useState(false);
useEffect(() => {
if (!open) {
return;
}
const fetchProfileInfo = async () => {
try {
const { data } = await api.get(`users/${userId}/info/`);
setProfileInfo(data);
} catch (e) {
setProfileInfo(null);
}
};
fetchProfileInfo();
}, [open, userId]);
const handleOpen = () => {
setOpen(true);
};
const handleClose = () => {
setOpen(false);
};
const renderTooltip = () => {
if (!profileInfo) {
return;
}
return (
<>
<h3 className={classes.profileName}>
{profileInfo.firstName} {profileInfo.lastName}
</h3>
<p className={classes.headline}>{profileInfo.headline}</p>
<Button size="small" variant="contained" color="primary" fullWidth>
Message
</Button>
</>
);
};
return (
<div className={classes.root}>
<Tooltip
arrow
classes={{
tooltip: classes.tooltip,
arrow: classes.arrow,
tooltipArrow: classes.tooltipArrow,
popperArrow: classes.popperArrow,
}}
interactive
placement="top-start"
onOpen={handleOpen}
onClose={handleClose}
title={renderTooltip()}
>
{children}
</Tooltip>
</div>
);
};
export default ProfileTooltip;
解决方案
useCallback
钩子用于记忆回调函数,以便在每次组件重新渲染时都不会重新创建它们。当您想要将函数传递给子组件并且该子组件依赖于引用相等以避免不必要的重新渲染时,这很有用。
useMemo
钩子用于记忆值以避免在组件的每次渲染上进行昂贵的计算。在渲染过程中传递给useMemo
运行的函数,因此不应在此函数中编写任何具有副作用的代码。
我想知道是否需要使用 useCallback 或 useMemo 来避免不必要的 API 调用?
这两个钩子对你的情况都没有帮助。
API调用等副作用属于useEffect
钩子,为了优化副作用的执行,您需要查看useEffect
钩子的依赖数组。
但是,您可以在钩子中包装handleOpen
和handleClose
函数。useCallback
这样做可以防止在每次渲染时重新创建这些函数,并且一个记忆函数引用将被传递给Tooltip
组件。
您需要确保获得useCallback
正确的钩子依赖数组,否则您将遇到难以调试的错误。
推荐阅读
- c++ - pytorch / libtorch C++ 中的自定义子模块
- python - 如何获取特定的外键值
- xamarin.forms - 如何在 SkiaSharp 中绘制平滑线图?
- hibernate - 是否可以使用 liquibase-hibernate 插件和 hibernate orm xml 计算 liquibase:diff?
- python - 如何修复 TypeError:不能将序列乘以“numpy.float64”类型的非整数
- c - 如何在 C 中返回字符串?
- data-structures - js中的“this”和python中的“self”
- javascript - VUE-指令中的事件监听器无法读取方法中定义的函数
- java - 在 UPDATE 查询中选择
- ajax - 根据另一个 EnumDropDownListFor 中的选择填写一个 EnumDropDownListFor