@zzmaster

Почему eslint предлагает внедрить в хук странную зависимость?

У меня скрипт чата. В lastMessage возникает строка, полученныя из вебсокета. В ней могут быть некоторые команды, они обрабатываются в первом useEffect, или непосредственно сообщение в чате - оно обрабатывается во втором useEffect. Также, по получению чат сообщения обновляется статус юзера, отправившего его.

// on new data from websocket
  useEffect(()=> {
    if (!lastMessage) return;

    let json = jsonDecode(lastMessage.data);
    if (json.scrollUp) {
       // ...   
    } else if (json.lastMessages) {
      setMessageHistory(x=>json.lastMessages);
    } else if (json.usersList) {
      setChatUsers(x=>json.usersList);
    } else if (isObject(json)) { // new message
      setLastChatMessage(x=>json);
    }
  }, [lastMessage]);
  
  // on new chat message
  useEffect(() => {
    if (!!lastChatMessage) {
      setMessageHistory((prev) => prev.concat(lastChatMessage).slice(-Config.chatMessageLimit));

      if ('on'===lastChatMessage.userStatus) {
          setChatUsers(setUserOnline(lastChatMessage, chatUsers));
        } else if ('off'===lastChatMessage.userStatus) {
          setChatUsers(setUserOffline(lastChatMessage, chatUsers));
        }      
    }
  }, [lastChatMessage]);


eslint при сборке печатает
React Hook useEffect has a missing dependency: 'chatUsers'. Either include it or remove the dependency array. You can also do a functional update 'setChatUsers(c => ...)' if you only need 'chatUsers' in the 'setChatUsers'


Замена на
setChatUsers(x=>setUserOnline(lastChatMessage, chatUsers));
 setChatUsers(x=>setUserOffline(lastChatMessage, chatUsers));

не подавила сообщение. Надо ли добавлять chatUsers в список зависимостей? Имхо, если я внутри устанавливаю chatUsers, то будет рекурсивный вызов хука, а нужно ли оно?
  • Вопрос задан
  • 66 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
setChatUsers(x=>setUserOnline(lastChatMessage, x));
setChatUsers(x=>setUserOffline(lastChatMessage, x));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы