Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在组件装载和卸载时,在react with socketio中更新组件_Javascript_Reactjs_Socket.io - Fatal编程技术网

Javascript 在组件装载和卸载时,在react with socketio中更新组件

Javascript 在组件装载和卸载时,在react with socketio中更新组件,javascript,reactjs,socket.io,Javascript,Reactjs,Socket.io,我在一个应用程序中工作,在这个应用程序中,我接收来自socketio的消息。我创建了一个组件,每次我从socketio收到一条消息时,我都会呈现一张带有该消息的卡片。这是可行的,问题是如果我卸载组件,一旦我再次装载它,我可以看到以前的组件和新组件,但我无法保留在卸载组件时排列的组件。实现这一目标的正确方法是什么 我想我需要从组件中取出套接字连接,因为我想保留会话期间接收到的所有消息 export default function MessagePage() { const [message,

我在一个应用程序中工作,在这个应用程序中,我接收来自socketio的消息。我创建了一个组件,每次我从socketio收到一条消息时,我都会呈现一张带有该消息的卡片。这是可行的,问题是如果我卸载组件,一旦我再次装载它,我可以看到以前的组件和新组件,但我无法保留在卸载组件时排列的组件。实现这一目标的正确方法是什么

我想我需要从组件中取出套接字连接,因为我想保留会话期间接收到的所有消息

export default function MessagePage() {
  const [message, setMessage] = useState([]);
  useEffect(() => {
    socket.on("message", (messageSocket) => {
      let mess = JSON.parse(messageSocket);
      setMessage(mess);
    });
  }, [])

  return <Message message={message} />
}
导出默认函数MessagePage(){
const[message,setMessage]=useState([]);
useffect(()=>{
socket.on(“message”,(messageSocket)=>{
让mess=JSON.parse(messageSocket);
设置消息(mess);
});
}, [])
返回
}
let messageCollection=[];
导出默认函数消息({Message}){
const[messageState,setMessageState]=useState([]);
messageCollection.unshift(消息);
useffect(()=>{
setMessageState(messageCollection);
},[信息])
返回(
{messageState.map(mes=>(
))}
);
}

我想我需要做一些事情,比如在用户位于不同页面时将消息保存在数组中,但我认为我仍然存在渲染已保存的消息和每隔几秒钟从socketio到达的消息的问题。

我认为将消息保存在数组中是可行的,但如果用户刷新页面,这些消息将再次消失。因此,最好的方法是使用后端服务器并将消息保存在数据库中。这将帮助您在socket中呈现所有旧消息,并且新消息可以按您现在的方式显示。是的,这是一个想法,用户可以看到会话期间创建的消息。另一方面,我提供了请求服务器数据的选项。因此,我认为在客户端将它们保存在一个数组中是一种选择,但我仍然不确定如何管理是否使用组件装载保存所有它们,然后在我移动到该页面时显示所有到达的内容,以及旧消息、组件卸载时到达的消息和正在到达的新消息。
let messageCollection = [];

export default function Message({ message }) {
  const [messageState, setMessageState] = useState([]);

  messageCollection.unshift(message);
  useEffect(() => {
    setMessageState(messageCollection);
  }, [message])

  return (
    <>
      {messageState.map(mes => (
          <Message
            ...
          />
      ))}
    </>
  );
}