开发者问题收集

当加载相同路由时,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