【发布时间】:2019-09-21 07:19:43
【问题描述】:
我正在通过socket.io 接收消息,并且我正在useEffect 挂钩函数中侦听传入消息。
问题是当我更新消息时它没有成功更新。
export const GroupContext = React.createContext({});
function GroupProvider(props){
const socket = useMemo(()=> io(url), [socket]);
const [messages, setMessages] = useState({});
const setMessage = (message, room) => {
if (messages[room] !== undefined){
setMessages({ [room]: [message, ...messages[room]] });
}
else{
setMessages({ [room]: [message] }); // updating messages per room
}
console.log('room: ', room); // I get the value: roomid100
console.log('message: ', message); // I get the message: Hi dear, How are you
}
useEffect(() => {
console.log('messages: ', messages); // But here I always get the last messages came.
},[messages]);
return (
<GroupContext.Provider value={{socket, messages, setMessage}}>
{props.children}
</GroupContext.Provider>
);
}
function Group(props){
const { socket, messages, setMessage } = useContext(GroupContext);
const receiveMessages = ()=> {
socket.on('getmessage', data => {
setMessage(data.message, data.room);
});
}
useEffect(()=> {
if(socket.connected === true){
receiveMessages();
}else{
socket.connect();
setTimeout(() => {
receiveMessages();
}, 2000);
}
return ()=> unmoun();
}, []);
// ....
}
function Main(){
// ....
return (
<GroupProvider>
<Group />
</GroupProvider>
);
}
注意: 相同的代码在类组件中也能正常工作,无需使用钩子。
【问题讨论】:
-
您可以与我们分享任何错误消息吗?
-
没有错误消息,它只是无法更新消息,如您所见,我在单独的房间中将上一个消息与当前消息附加,因此它不会附加或更新消息。
-
在您的 setmessage 中,更改 setMessages({ [room]: [message, ...messages[room]] });到 setMessages({ [ [message, ...messages[room]] }); } 看看它是否有效?
-
或者改成setMessages("test")去调试看看有没有得到数据
-
setMessages({ [ [message, ...messages[room]] });这对于分隔每个房间的消息是不正确的。
标签: reactjs react-native socket.io react-hooks