【问题标题】:Correct dependency array for useEffect with React hooks使用 React 钩子为 useEffect 正确的依赖数组
【发布时间】:2020-01-23 20:37:30
【问题描述】:

我正在使用Create-React-App 和(优秀的)use-http 进行自定义 useFetch 挂钩。目标是在登录帐户区域时进行多次 API 调用:

const [user, setUser] = useState(null)
const [profile, setProfile] = useState(null)
const [posts, setPosts] = useState(null)

const request = useFetch('/')

const initializeAccount = async () => {
  try {
    const user = await request.get('api/user/')
    const profile = await request.get('api/profile/')
    const posts = await request.get('api/posts/')
    if (user) {
      setUser(user.data)
    }
    if (profile) {
      setProfile(profile.data)
    }
    if (posts) {
      setPosts(posts.data)
    }
  } catch (e) {
    console.log('could not initialize account')
  }
}

useEffect(() => {
  initializeAccount()
  return () => console.log('unmount')
})

我尝试使用 [] 作为依赖数组,但我收到一个 linting 错误,提示将 initializeAccount 移动到依赖数组。如果我添加它,该函数将无限运行。

设置依赖数组以便调用该函数一次的正确方法是什么?另外,在这种情况下,处理每个 API 调用中止的正确方法是什么?

【问题讨论】:

  • 不确定 useFetch 是否每次都会返回相同的引用,但您可以尝试以下操作:const initializeAccount = useCallback(async () => {,,,},[request]); 并将 initializeAccount 传递给 useEffect。

标签: reactjs fetch react-hooks use-effect


【解决方案1】:

伙计,为了对 api 调用运行一次 useEffect,你必须这样做:

useEffect(() => {
   initializeAccount()
   return () => console.log('unmount')
},[])

希望对你有帮助。

【讨论】:

  • 如果我这样做,我会收到一个 linting 错误,说要向数组添加依赖项 - 这是否意味着 linting 错误不正确?另外,我会在 useEffect 中返回什么来中止 fetch 调用?
  • @Toby,即在documentationrequest.abort()
  • @HMR 我已经读过,但我不确定如何使用它 - 我会试试看,谢谢。
  • @Toby 那个 lint 规则仍然是相当新的,而且非常生硬,只需为该行添加一个 lint 覆盖。我还建议在上面留下评论,至于覆盖的原因,只有在挂载上触发钩子是一个非常合法的原因。我相信 react-hooks eslinter 的作者正在研究更细粒度的控制/规则,可能只需要等待一段时间。
  • 这就是为什么我添加了关于发表评论的内容。我在工作中努力推动我的团队使用钩子,后来发现了钩子 linter,所以不仅要教团队正确使用钩子,还要教正确的 lint 规则管理。它可能会与自动格式化程序一起尝试自动修复 lint 警告,这就是需要覆盖的原因,并且评论有助于向其他开发人员解释 为什么 覆盖,这绝对是故意的.
猜你喜欢
  • 1970-01-01
  • 2020-09-15
  • 2019-10-08
  • 2021-01-28
  • 2019-08-09
  • 2019-08-06
  • 2020-04-29
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多