gpt4 book ai didi

javascript - 我应该添加 useCallback 或 useMemo 到我的效果吗?

转载 作者:行者123 更新时间:2023-12-01 15:41:57 25 4
gpt4 key购买 nike

一旦用户将鼠标悬停在按钮上,以下工具提示将调用 API。
我想知道我是否需要使用 useCallbackuseMemo避免不必要的 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钩子(Hook)用于内存回调函数,以便在每次组件重新渲染时都不会重新创建它们。当您想要将函数传递给子组件并且该子组件依赖于引用相等以避免不必要的重新渲染时,这很有用。useMemo钩子(Hook)用于内存值以避免在组件的每次渲染上进行昂贵的计算。传递给 useMemo 的函数在渲染过程中运行,所以任何有副作用的代码都不应该写在这个函数中。

I wonder if I need to work with useCallback or useMemo to avoidunnecessary API calls?


这两个钩子(Hook)对你的情况都没有帮助。
API 调用等副作用属于 useEffect钩子(Hook)并优化副作用的执行,您需要查看 useEffect 的依赖数组钩。
但是,您可以包装 handleOpenhandleClose useCallback 中的函数钩。这样做可以防止在每次渲染时重新创建这些函数,并且一个内存函数引用将被传递给 Tooltip零件。
您需要确保获得 useCallback 的依赖数组。正确钩子(Hook),否则你会遇到难以调试的错误。

关于javascript - 我应该添加 useCallback 或 useMemo 到我的效果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63156374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com