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