Реагирующие крючки — зависимости повторно запускают крючки

#reactjs #react-native

#reactjs #react-native

Вопрос:

Я продолжаю бороться с той же проблемой с реактивными крючками. Массив зависимостей. У меня есть много перехватов, которые должны запускать и обрабатывать разные события. Например:

 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 внутри этих функций-крючков, что является пустой тратой времени и делает мой код уродливым.

Чего мне не хватает? Как мне справиться с этим лучше?

Комментарии:

1. Чего вы хотите достичь? Что вы подразумеваете под «Это заставляет меня добавлять операторы if внутри этих функций хука, что является пустой тратой времени и делает мой код уродливым». Что произойдет, если вы не используете оператор if?

2. Вы можете создать useEffect для каждой зависимости, этот useEffect будет выполняться только при изменении этой зависимости. Поскольку у вас есть один большой эффект использования с несколькими зависимостями, он будет запускаться при изменении какой-либо из этих зависимостей (вот почему он запускается каждый раз при изменении состояния пользователя)

3. @kimobrian254 вы можете увидеть a if(user)... в моем коде. Здесь я удостоверяюсь, что у меня действительно есть пользователь, прежде чем запускать DoSomethingWith. Другой оператор if может быть if(user.hasCookies amp;amp; Cookies === 'yummy' amp;amp; ...

4. @CelsoWellington В эффекте, который я написал, есть только три зависимости. И я действительно добавляю их только потому, что мне нужно обновить пользователя данными. Я не хочу, чтобы он запускался, когда пользователь обновляется ЗА пределами этого перехвата. Я не хочу снова прослушивать уведомления всякий user раз, когда происходят изменения. Имеет ли это смысл?

5. Это имеет смысл. Что ж, я предлагаю вам переместить уведомления в отдельное от пользователя состояние и создать эффект использования только для него, потому что: например, когда пользователь меняет свое имя, и вы избегаете эффекта использования уведомлений, вы больше не будете прослушивать уведомления из-за предыдущей очистки, поэтому вам нужночтобы добавить его снова. Вот почему я предлагаю вам перевести его в отдельное состояние и использовать это состояние как зависимость вместо использования состояния пользователя 🙂