Javascript React Hooks React Hooks/deps eslint规则似乎过于敏感

Javascript React Hooks React Hooks/deps eslint规则似乎过于敏感,javascript,reactjs,react-hooks,eslint,Javascript,Reactjs,React Hooks,Eslint,我很难完全理解linter规则react hooks/dep中的依赖关系。在我看来,在许多情况下,数组中不需要特定的变量,因为不希望在变量更改时调用钩子。但是,这个linting规则将告诉您,如果它位于钩子内部,那么它将从依赖项中丢失。我知道我可以禁用该行,但我想知道我是否误解了该规则,以及是否有更好的方法使用钩子编写此功能。下面是一个代码示例,我觉得这个规则不需要应用 我有以下两个状态变量: const [taggedUsers, setTaggedUsers] = useState([])

我很难完全理解linter规则react hooks/dep中的依赖关系。在我看来,在许多情况下,数组中不需要特定的变量,因为不希望在变量更改时调用钩子。但是,这个linting规则将告诉您,如果它位于钩子内部,那么它将从依赖项中丢失。我知道我可以禁用该行,但我想知道我是否误解了该规则,以及是否有更好的方法使用钩子编写此功能。下面是一个代码示例,我觉得这个规则不需要应用

我有以下两个状态变量:

const [taggedUsers, setTaggedUsers] = useState([])
const [users, setUsers] = useState([])
taggedUsers表示与实体关联的用户(其中只有用户的电子邮件字符串被保存到),而用户是从另一个api获取的用户对象,该api具有比用户电子邮件更多的信息

我有一个带有钩子的组件,它在调用taggedUser对象时将其绑定,这样我就可以在页面上显示它们的名称。当我加载页面时,我点击的提供实体的端点有一个属性taggedUsers,它只是与实体关联的电子邮件列表。我有一个转换器,它接收这些电子邮件并将它们映射到taggedUser对象列表,如下所示:

{ email: "john.smith@gmail.com", name: null, id: "john.smith@gmail.com" }
{ email: "john.smith@gmail.com", name: "John Smith", id: "john.smith@gmail.com" }
水合作用后,对象将如下所示:

{ email: "john.smith@gmail.com", name: null, id: "john.smith@gmail.com" }
{ email: "john.smith@gmail.com", name: "John Smith", id: "john.smith@gmail.com" }
我有一个端点,我可以点击它来获得一个用户列表,我使用从那里获取的数据来确定用户对象的名称。当我的组件第一次呈现时,我获取用户,并将变量“users”的状态设置为这些用户。用户的变化会触发下一个钩子:

useEffect(() => {
const hydrateTaggedUsers = () => {
  const hydratedTaggedUsers = []
  users.forEach((user) => {
    taggedUsers.forEach((taggedUser) => {
      if (user.email === taggedUser.email) hydratedTaggedUsers.push(user)
    })
  })
  setTaggedUsers(hydratedTaggedUsers)
}

if (users.length) hydrateTaggedUsers()
}, [users])
我只希望在“用户”发生变化时调用这个钩子一次,即每次页面加载只调用一次。根据linter设置,钩子的依赖项中缺少taggedUsers。但是,我不希望在taggedUsers的值发生变化时调用此钩子,将其作为依赖项添加会导致堆栈溢出,因为此钩子会改变taggedUsers的值

关于如何构造钩子,我有什么遗漏吗?我觉得,由于我不希望在更新taggedUsers的值时调用这个钩子,所以它不应该包含在依赖项数组中。然而,林特仍然希望它在那里。在这种情况下,禁用线路是不可避免的吗?

试试看。。 你有完整的代码让我可以更深入地检查吗

我建议这样做,不确定它的工作:)