当用户将鼠标悬停在按钮上时,以下工具提示将调用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;
答案 0 :(得分:2)
useCallback
钩子用于记住回调函数,以便在每次重新渲染组件时都不会重新创建它们。当您要将函数传递给子组件并且该子组件依赖于引用相等性以避免不必要的重新渲染时,这很有用。
useMemo
挂钩用于记忆值,以避免在每次渲染组件时进行昂贵的计算。传递给useMemo
的函数在渲染过程中运行,因此任何有副作用的代码都不应写在该函数中。
我想知道是否需要使用useCallback或useMemo来避免 不必要的API调用?
这两个钩子对您的情况无济于事。
API调用之类的副作用属于useEffect
挂钩,并且为了优化副作用的执行,您需要查看useEffect
挂钩的依赖项数组。
但是,您可以将handleOpen
和handleClose
函数包装在useCallback
挂钩中。这样做将防止在每个渲染器上重新创建这些功能,并且已记忆的功能引用将传递给Tooltip
组件。
您需要确保正确获取useCallback
钩子的依赖项数组,否则会遇到难以调试的错误。