我正在使用 react-native、node、mongoose、socket.io 开发聊天应用程序,问题是,当使用 socket.io 时,当我从用户 1 向用户 2 发送消息时,我能够接收来自用户 1 的发送消息但是即使我输入了正确的依赖项,useEffect它也不会重新渲染组件以将新消息添加到数组中messages。下面是代码供参考:
这是我的 MessageScreen & 我socket在功能组件的范围之外定义了MessageScreen:
const socket = io('ws://192.168.29.123:8080', {
transports: ['websocket'],
}); // declared outside the functional component
const [arrivalMessage, setArrivalMessage] = useState(null);
useEffect(() => {
socket.on('getMessage', data => {
console.log('received: ',data);
setArrivalMessage({
matchId: matchId,
senderId: data.senderId,
text: data.text,
createdAt: Date.now(),
updatedAt: Date.now(),
});
});
console.log('arrival msg: ',arrivalMessage);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [arrivalMessage, socket]);
useEffect(() => {
// ensures we don't get anyother user's msg
arrivalMessage &&
match.includes(arrivalMessage.senderId) &&
setMessages((prev) => [...prev, arrivalMessage]);
}, [arrivalMessage, match]);
useEffect(() => {
socket.emit('addUser', uid);
}, [uid]);
虽然我从我的朋友那里收到了正确的数据,但状态没有更新,因此我无法显示实时消息。因此,每当我从 1 个用户向另一个用户发送消息时,这是我的控制台输出,它确认我能够从该用户接收消息,并且显然是标题错误:
LOG received: {"senderId": "61b5d1725a7ae2994", "text": {"matchId":"61b5d172511867ae298c", "senderId": "61b5d1725a7ae2994", "text": "me too!"}}
ERROR Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function. in MessageScreen (at SceneView.tsx:126)
LOG received: {"senderId": "61b5d1725a7ae2994", "text":{"matchId":"61b5d111867ae298c","senderId":"61b5d1725a7ae2994", "text": "me too!"}}
如果有人能指出这里的问题,那将非常有帮助!谢谢!