【问题标题】:useEffect has a missing dependency: 'user' [duplicate]useEffect 缺少依赖项:'user' [重复]
【发布时间】:2020-12-13 17:37:57
【问题描述】:

我正在寻找某个查询字符串,当它在页面加载时传递时,我需要将我的用户状态更新为“高级”。我有:

  useEffect(() => {
    const queryString = require('query-string');
    const values = queryString.parse(window.location.search);
    console.log('before' + user.premium);
    if (values.premium !== ''){
      setUser({...user, premium: true});
    }
    console.log('after' + user.premium);
  }, []);

我正在使用 React 功能组件,我的用户是一个包含许多其他值的对象,除了“高级”键。据我了解,传递空数组 [] 将导致 useEffect 仅在页面加载时运行。但是,这样做会出现错误:

React Hook useEffect has a missing dependency: 'user'.。但是,当我在该数组中包含 user 时,页面会不断重新加载(因为我正在更新它的值)。我也尝试过传入setUser,但没有成功。

【问题讨论】:

  • setUser(prevUser => ({ ...prevUser, premium: true }))
  • @PatrickRoberts 你能教我吗?你们所有的高级代表有时评论答案而不是实际提交答案背后的理论是什么?
  • @Rustang 已经多次回答了这个完全相同的问题的琐碎变化......仍在尝试找到其中一个要关闭的重复项。
  • @Rustang 在评论中提供足够的信息可能会更容易解决问题,但它本身就是一个不完整或糟糕的答案。
  • 但一个完整的答案总是最好的帮助未来可能实施 cmets 的人。

标签: javascript reactjs react-hooks


【解决方案1】:

您可以将对象的属性作为useEffect 的依赖项传递。我创建了一个有效的sandbox here。

另外,不要太担心 eslint 规则 react-hooks/exhaustive-deps,将其视为更多指南,如果它促使您添加您不添加的依赖项,请不要害怕添加 eslint-disable-next-line不认为应该添加。

import React, { useEffect, useState } from "react";

export default function App() {
  const [user, setUser] = useState({ count: 0, premium: false });

  useEffect(() => {
    console.log("when component mounts");
  }, []);

  useEffect(() => {
    console.log("when component updates");
  });

  useEffect(() => {
    console.log("when premium changes");
  }, [user.premium]);

  return (
    <div>
      <p>Count: {user.count}</p>
      <p>Premium: {user.premium}</p>
      <button
        onClick={() => setUser((prev) => ({ ...prev, count: prev.count + 1 }))}
      >
        Increment Count
      </button>
      <button
        onClick={() => setUser((prev) => ({ ...prev, premium: !prev.premium }))}
      >
        Toggle premium
      </button>
    </div>
  );
}

【讨论】:

  • 另一方面,忽略 eslint 规则 react-hooks/exhaustive-deps 通常会由于保留过时的引用而导致细微的错误。总有一种方法可以满足详尽的依赖关系,即使它有时比您想要的更冗长。
  • 恕我直言,单元测试比 linter 更擅长发现依赖错误。使代码过于冗长以安抚 linter 可能会损害代码的可读性和可维护性,而实际上并没有提供很大的信心。
猜你喜欢
  • 2021-10-16
  • 2020-03-24
  • 2020-03-04
  • 2021-02-23
  • 2021-08-19
  • 2020-10-26
  • 2019-10-24
相关资源
最近更新 更多