작성
·
179
0
강의장면에서 크롬창 2개켜서 포커스를 해야만 실시간 채팅이 반영된다고 말씀해주셨는데요.
제가 컴퓨터 1대를 더 준비해서 컴퓨터2대로 통신을 해봤는데 이미 포커싱이 된 상태에서는 실시간으로 채팅이 올라오지 않더라구요. 포커싱을 한번 해제했다가 돌아와야 반영됬습니다. (하지만 Socket.io는 바로 data를 받아옵니다)
onMessage에서는 실시간으로 data를 받아와 mutateChat()함수도 실행되는데 chatData가 바꼇음에도 불구하고 리렌더링이 진행되지 않았습니다. 아마 immutable하게 바꾸지 않아서 그런것 같은데....
아래 코드에서 mutateChat()을 통해 chatData를 변경하면 리렌더링이 일어나야하는데 리렌더링이 일어나지 않아서 실시간으로 반영이 안되는 것 같습니다. 혹시 이 부분은 제가 잘못한게 있는 것인지 아니면 의도한 것인지 궁금합니다.
const onMessage = useCallback(
(data: IDM) => {
if (data.SenderId === Number(id) && myData.id !== Number(id)) {
mutateChat((chatData) => {
chatData?.[0].unshift(data);
console.log(chatData);
// 여기서 chatData가 변경됬음에도 불구하고 리렌더링이 일어나지 않습니다.
return chatData;
}, false).then(() => {
if (scrollbarRef.current) {
if (
scrollbarRef.current.getScrollHeight() <
scrollbarRef.current.getClientHeight() + scrollbarRef.current.getScrollTop() + 150
) {
//console.log('scrollToBottom!', scrollbarRef.current?.getValues());
setTimeout(() => {
scrollbarRef.current?.scrollToBottom();
}, 50);
}
}
});
}
},
[chatData, scrollbarRef],
);
저도 이와 비슷하게 해결되지 않는 문제가 있습니다.
채팅방에서 채팅을 보냈는데, 본인이 보낸 채팅조차도 바로바로 올라오고 있지 않습니다.
console을 찍어보면 chatData가 분명 변경은 되었지만, 리렌더링이 되고 있지 않습니다.
false를 제거하거나 revalidate를 기다려서 서버에서 직접 fetch할 때만 컴포넌트가 리렌더링 됩니다.
고민해본 결과 unshift가 불변성을 지키지 않는 메서드라서 그런가 싶은데, 이는 문제가 없는지 궁금합니다.
추가로, makeSection에 console을 달아본 결과, local mutate를 시켰을때 makeSection이 작동하지 않는 것을 봤습니다.