当前位置: 首页 > 知识库问答 >
问题:

自定义挂钩中的Useeffect依赖项列表警告

益清野
2023-03-14

所以我正在构建一个反应应用程序,我试图通过使用axios的自定义钩子简化调用我的后端api。这个钩子保持加载和错误状态,这样我就不必在发出请求的每个组件中保持该状态。它还公开了一个调用Api()函数,该函数发出实际请求,然后更改钩子中的状态。这是自定义钩子的代码。

import { useState } from 'react'
import axios, { AxiosRequestConfig } from 'axios'

export default <DataType>() => {
  const [loading, setLoading] = useState(false)
  const [error, setError] = useState('')
  const [data, setData] = useState<DataType>()

  async function callApi(config: AxiosRequestConfig) {
    setLoading(true)
    setError('')
    try {
      const response = await axios.request<DataType>(config)
      setData(response.data)
    } catch (error) {
      if (error.response) setError(error.response.data.msg)
      else if (error.request) setError('A network error occured')
      else setError('An error occured')
    } finally {
      setLoading(false)
    }
  }

  return {
    data,
    loading,
    error,
    callApi
  }
}

然后,我尝试在我想要发出请求的组件中的useEffect钩子中使用这个callApi()方法。

const { data: posts, loading, error, callApi } = useApi<Post[]>()

  useEffect(() => {
    callApi({
      url: 'http://localhost:4000/blog'
    })
  }, [])

这是预期的工作,但我的linter(设置与create-react-app)给出了这个警告:

React Hook use效应有一个缺失的依赖项:“调用Api”。要么包括它,要么删除依赖数组report-hoks/详尽-deps如果我要么将call Api添加到依赖数组,要么完全删除依赖数组,将创建一个无限循环,因为call Api更新状态,我只想在挂载时调用api。

如果我删除依赖项列表或将callApi添加到依赖项列表中,那么效果将在无限循环中一直被调用,我只想在mount上调用。

该如何修复此警告,代码是否涉及任何风险(毕竟,linter抱怨是有原因的)?

共有2个答案

池阳伯
2023-03-14

您的useffect使用自定义挂钩返回的callApi函数。

由于函数可以作为组件中的任何道具或状态进行更改,因此React警告您,如果函数发生更改,则永远不会调用新函数。

如果您想摆脱警告,您应该将该函数添加到第二个参数数组中。

useEffect(() => {
    callApi({
      url: 'http://localhost:4000/blog'
    })
  }, [ callApi ])
帅德惠
2023-03-14

这应该起作用:

const callApi = useCallback(async (config: AxiosRequestConfig) => {
  setLoading(true)
  setError('')
  try {
    const response = await axios.request<DataType>(config)
    setData(response.data)
  } catch (error) {
    if (error.response) setError(error.response.data.msg)
    else if (error.request) setError('A network error occured')
    else setError('An error occured')
  } finally {
    setLoading(false)
  }
}), [])

...和...

useEffect(() => {
  callApi({
    url: 'http://localhost:4000/blog'
  })
}, [callApi])

callApi从未更改,因此将其传递给useffect将具有与useffect(…,[])相同的行为。

 类似资料:
  • 我在useeffect钩子上得到以下错误。 React Hook use效应有一个缺失的依赖项:当前页面。要么包含它,要么删除依赖array.eslintreact-钩子/穷举-deps 你知道我为什么会得到这个吗? }

  • 使用React 16.8.6(在以前的版本16.8.3上很好)时,当我试图防止fetch请求上的无限循环时,会出现这个错误 我一直找不到一个解决方案来停止无限循环。我希望不要使用。我确实找到了这个讨论https://github.com/facebook/react/issues/14920,其中一个可能的解决方案是我对自己在做什么不太有信心,所以我还没有尝试实现它。 我有这个当前的设置React

  • 一旦我运行下面的代码,我得到以下错误: React Hook useEffect缺少依赖项:“list”。包括它或删除依赖项数组react hooks/dep 我找不到发出警告的理由。

  • 我想在步骤的值更改时更改formStepTouched的值,因此我使用useEffect。但useEffect发出警告,它缺少对FormStepTouch的依赖性。由于这是正在更改的值,因此将其放入依赖项数组将导致无限调用。 请参阅下面的codesandbox链接:https://codesandbox.io/s/brave-gould-ymjt0?file=/src/App.js 正如您所看到的

  • 我在关注丹·阿布拉莫夫的这篇文章: https://overreacted.io/making-setinterval-declarative-with-react-hooks/ 在本文中,Dan制作了一个自定义的useInterval钩子,以创建一个动态的setInterval。 钩子看起来像这样: 但有一部分我不明白,那就是: 我理解,如果延迟更改,则调用此useEffect。回调被分配给ti

  • null 0.0.1-快照 _remote.repositories Maven-metadata-local org-utility-0.0.1-snapshot.jar org-utility-0.0.1-snapshot.pom org-utility-0.0.1-snapshot-jar-with-dependencies.jar 因此,我能够将jar“retrieve org-utili