reactjs - 如何防止React Hook的useEffect多次取数据

标签 reactjs react-hooks

下面的示例显示了我对 useEffect() 的使用如何导致多个 Ajax 请求。在组件的初始渲染中,会发出两次此请求。如果标签被改变,这个请求会被发出两次。

我可以使用某种内部状态变量来跟踪我是否已经获取。或者我可以创建一种堆栈,在其中推送某种类型的潜在请求,然后在返回之前弹出堆栈并运行最终请求。但所有这些看起来都像是黑客攻击。

(如果有帮助,应用程序要大一些,我正在使用 redux。是否有更广泛的解决方案,如 redux-saga 的取消?)

const Thing => () => {
  const [tagId, setTagId] = useState(null)
  const [query, setQuery] = useState('')

  useEffect(() => {
    doSomeAjaxAndUpdateResults()
    setQuery('')
  }, [tagId])

  useEffect(() => {
    doSomeAjaxAndUpdateResults()
  }, [query])

  // ... bunch of extra effects with similar dependencies.
}

最佳答案

您可以将两个内部状态变量合并到一个 useEffect Hook 中,然后如果有一个更改,您可以执行 doSomeAjaxAndUpdateResults

const Thing = (prop) => {
  const [tagId, setTagId] = useState(null)
  const [query, setQuery] = useState('')

  useEffect(() => {
    doSomeAjaxAndUpdateResults()
    setQuery('')
  }, [tagId, query])

  return ...;
}

下面是同样依赖于 props 被传递的实例:https://stackblitz.com/edit/react-wzmxmj

第一次渲染带有初始值,第二次渲染带有传递的 props,然后后续的 props 变化将分别触发一次调用。

关于reactjs - 如何防止React Hook的useEffect多次取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57796746/

相关文章:

javascript - 在React中使用扩展运算符进行redux?数组映射问题?

javascript - React 中的变更检测

javascript - 在非 React 组件中使用钩子(Hook)的替代方法是什么?

javascript - 在 React 中使整个 Div 可点击

javascript - 在 propTypes 中 react 错误

reactjs - yarn 工作区和 yarn 链接

reactjs - 测试一个使用 Resize Observer 的 React Hook

javascript - React hooks - 清除超时和间隔的正确方法

javascript - 在 JSX 表达式中连接字符串和 HTML

javascript - 在 React 中提交后重定向