当加载相同路由时,React hook 不会调用“mount”,只会调用 clear 方法
2021-07-15
221
我有这个钩子,它在安装组件时请求数据,在卸载时清除给定实体的存储:
export const useFetch = () => {
const dispatch = useDispatch()
const data = useSelector(entitySelector.data) // Selector which returns data from store
const status = useSelector(entitySelector.status) // Selector which returns request status; idle, pending, fulfilled, rejected
useEffect(() => {
if (status === 'idle') {
dispatch(entityActions.request(id))
}
return () => {
dispatch(entityActions.reset())
}
}, [])
return data
}
在组件中的使用方式如下:
const data = useFetch()
在组件的初始加载时,一切都按预期工作,请求数据,然后加载并返回包含存储内数据的对象。卸载组件时,将调用重置操作并清除存储。
如果我切换到其他路线并返回,一切都按预期工作。 但是,如果我使用相同的视图打开链接,或者仅保存文件并让 CRA 模块重新加载器刷新组件,则不会调用用于获取数据的 useEffect 部分,也不会呈现任何数据。
路由嵌套在其他组件中,如下所示:
<div>
<ul>
<li>
<Link to="/foo">Foo</Link>
</li>
<li>
<Link to="/bar">Bar</Link>
</li>
</ul>
<Route path="/foo" component={Foo} />
<Route path="/bar" component={Bar} />
</div>
如何修复此问题,以便在再次加载相同路由时调用 useEffect 获取部分?
1个回答
尝试将 entitySelector、status 和 id 添加到 useEffect 依赖项数组,并可能从此返回 fn 中删除“dispatch(entityActions.reset())”
export const useFetch = () => {
const dispatch = useDispatch()
const data = useSelector(entitySelector.data) // Selector which returns data from store
const status = useSelector(entitySelector.status) // Selector which returns request status; idle, pending, fulfilled, rejected
useEffect(() => {
if (status === 'idle') {
dispatch(entityActions.request(id))
}
dispatch(entityActions.reset())
}, [entitySelector, status, id])
return data
}
Victor Chagas Seibert
2021-07-26