У меня скрипт чата. В 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, то будет рекурсивный вызов хука, а нужно ли оно?