如何解决React useEffect有条件地运行
如何防止每次渲染组件时我的React组件都获取图像,而是从商店获取它们?我不想一遍又一遍地进行API调用来限制速率,但是useEffect
的问题在于它似乎没有意识到变量是在效果的“外部”设置的。似乎完全忽略了!images.length
,当我记录images.length
的值时,它始终是0
:(
Images.tsx
const dispatch = usedispatch();
const images = useSelector(selectedImages);
useEffect(() => {
if (!images.length) {
dispatch(fetchImages());
}
},[]);
解决方法
使用React钩子useMemo
,您只会在需要时调用API
https://www.robinwieruch.de/react-usememo-hook
https://reactjs.org/docs/hooks-reference.html#usememo
,它总是记录0
是因为您没有在useEffect
的依赖项数组中放置任何内容,因此每当React重新渲染您的组件时,它都会在useEffect
里面查看dep数组中没有任何内容,因此只需跳过运行useEffect
。
使用useEffect
时,应在useEffect
内使用的useEffect
数组中声明依赖项
const dispatch = useDispatch();
const images = useSelector(selectedImages);
useEffect(() => {
if (!images.length) {
dispatch(fetchImages());
}
},[images]); // Our deps
所以,我们说:
- 首先,默认情况下它将运行
useEffect
并执行该效果内的所有逻辑。如果images数组为空,则调用API来获取图像。 - 第二个
images
数组不再为空,第二个images
与第一个images
数组为空,因此它仍然运行到useEffect
。但这不会再获取图像,因为您在那里有if condition
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。