首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React Hooks react-hooks/exhaustive deps eslint规则似乎过于敏感

React Hooks react-hooks/exhaustive deps eslint规则似乎过于敏感
EN

Stack Overflow用户
提问于 2020-02-26 01:28:05
回答 1查看 76关注 0票数 2

我在完全理解linter规则react-hooks/exhaustive deps中的依赖项时遇到了麻烦。在我看来,在许多情况下,您不需要数组中的特定变量,因为您不希望在该变量发生变化时调用钩子。但是,这个内联规则将告诉您,如果它在钩子内,则依赖项中缺少它。我知道我可以禁用这一行,但我想知道我是否对规则有什么误解,以及是否有更好的方法来使用钩子编写此功能。下面是一个我觉得这条规则不需要应用的代码示例。

我有以下两个状态变量:

代码语言:javascript
复制
const [taggedUsers, setTaggedUsers] = useState([])
const [users, setUsers] = useState([])

taggedUsers表示与实体关联的用户(实体中只保存用户的邮件字符串),而用户是从另一个接口获取的用户对象,除了用户的邮件之外,还包含更多的信息。

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

代码语言:javascript
复制
{ email: "john.smith@gmail.com", name: null, id: "john.smith@gmail.com" }

经过水合处理后,该对象将如下所示:

代码语言:javascript
复制
{ email: "john.smith@gmail.com", name: "John Smith", id: "john.smith@gmail.com" }

我有一个端点,我可以点击它来获取用户列表,并且我使用从那里获取的数据来补充用户对象的名称。当我的组件第一次呈现时,我获取用户,并将变量" users“的状态设置为这些用户。用户的变化会触发下一个钩子:

代码语言:javascript
复制
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])

我希望这个钩子只在“用户”改变时被调用一次,也就是每次页面加载只调用一次。根据链接器设置,挂钩的依赖项中缺少taggedUsers。但是,我不希望在taggedUsers的值发生变化时调用此钩子,并将其添加为依赖项导致堆栈溢出,因为此钩子会更改taggedUsers的值。

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

EN

回答 1

Stack Overflow用户

发布于 2020-02-27 05:07:03

尝试一些东西..

你有完整的代码好让我更深入的检查吗?

我建议这样做,但不确定它是否有效:)

代码语言:javascript
复制
useEffect(() => {
 if (users.length) {
   const hydratedTaggedUsers = [];
   users.forEach(user => {
     taggedUsers.forEach(taggedUser => {
       if (user.email === taggedUser.email) hydratedTaggedUsers.push(user);
     });
   });
   setTaggedUsers(hydratedTaggedUsers);
 }
}, [users]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60400199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档