Reactjs React钩子-依赖项重新运行钩子

Reactjs React钩子-依赖项重新运行钩子,reactjs,react-native,Reactjs,React Native,我一直在为同样的问题与React Hooks斗争。依赖项数组。 我有很多钩子可以触发和处理不同的事件。 例如: useEffect(() => { const doSomethingWith = (notification: Notifications.Notification) => { ... setUser({ notifications: badgeCount }); }; notificationListener.current = Notif

我一直在为同样的问题与React Hooks斗争。依赖项数组。 我有很多钩子可以触发和处理不同的事件。 例如:

useEffect(() => {
  const doSomethingWith = (notification: Notifications.Notification) => {
    ...
    setUser({ notifications: badgeCount });
  };

  notificationListener.current = Notifications.addNotificationReceivedListener(
    (notification) => {
      if (user) {
        doSomethingWith(notification);
      }
    }
  );

  return () => {
    Notifications.removeNotificationSubscription(notificationListener);
  };
}, [setExpoPushToken, setUser, user]);
在这段简化的代码中,您可以看到我跟踪通知,当我收到通知时,我使用通知中的数据并用它更新用户对象

但是,每当用户更新时,整个过程都会运行。比如,如果我更新用户名,通知钩子就会运行。这对我来说没什么意义。它迫使我在这些钩子函数中添加if语句,这是一种浪费,使我的代码难看


我错过了什么?如何更好地处理此问题?

您希望实现什么目标?“它迫使我在这些钩子函数中添加if语句,这是一种浪费,让我的代码很难看。”这是什么意思?如果你不使用if语句,会发生什么?你可以为每个依赖项创建一个useffect,只有当依赖项发生变化时,useffect才会运行。由于您有一个具有多个依赖项的大useEffect,因此如果这些依赖项中的任何一个发生变化,它都会运行(这就是为什么每次用户状态发生变化时它都会运行)@kimobrian254您可以在我的代码中看到一个
if(user).
。在这里,我要确保在运行doSomethingWith之前我确实有一个用户。另一个if语句可以是
if(user.haskookies&&Cookies=='yummy'&&…
@CelsoWellington在我写的效果中只有三个依赖项。我真的只添加它们,因为我需要用数据更新用户。我不希望当用户在这个钩子之外更新时它运行。每当
用户
更改。这有意义吗?有意义。好吧,我建议您将通知移动到与用户分离的状态,并为其创建useEffect,因为:例如,当用户更改其名称时,您将退出通知useEffect,因为之前的清理,您将不再侦听通知,因此,y您需要再次添加它。这就是为什么我建议您将其移动到单独的状态,并将该状态用作依赖项,而不是使用用户状态:)