Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.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
Reactjs 在useeffect中反应功能组件访问状态_Reactjs_Use Effect_Use State_React Functional Component - Fatal编程技术网

Reactjs 在useeffect中反应功能组件访问状态

Reactjs 在useeffect中反应功能组件访问状态,reactjs,use-effect,use-state,react-functional-component,Reactjs,Use Effect,Use State,React Functional Component,我有一些反应成分如下。我可以使用消息作为回报,但如果我试图访问某个函数中的消息,或者像示例中那样使用效果,我总是成为初始值。如何在功能组件中解决它?谢谢 const Messages = () => { const { websocket } = useContext(WebsocketsContext); let [ messages, setMessages ] = useState([]); useEffect(() => { getMess

我有一些反应成分如下。我可以使用消息作为回报,但如果我试图访问某个函数中的消息,或者像示例中那样使用效果,我总是成为初始值。如何在功能组件中解决它?谢谢

const Messages = () => {

   const { websocket } = useContext(WebsocketsContext);

   let [ messages, setMessages ] = useState([]);

   useEffect(() => {
      getMessages()
      .then(result => {
         setMessages(result);
      })
   }, []);

   useEffect(() => {
      if(websocket != null){
         websocket.onmessage = (msg) => {
            let wsData = JSON.parse(msg.data);

            if(wsData.message_type == 'Refresh'){
               console.log(messages)
            };
         };
      };
   }, [websocket]);

   return(
        <div>...</div>    
   );

};
export default Messages;

看起来您遇到了一个问题

依赖项数组中带有[websocket]的useEffect只有在websocket引用/值更改时才会更新。无论何时,函数都会在该时间点围绕消息创建一个闭包。因此,消息的价值将保持在该闭包内。如果消息在创建websocket后更新,它将永远不会更新onmessage回调函数中消息的值

要解决此问题,请将消息添加到依赖项数组。[WebSocket,消息]。这将确保useEffect回调始终具有消息的最新状态,而onmessage函数将具有消息的最新状态

 useEffect(() => {
      if(websocket != null){
         websocket.onmessage = (msg) => {
            let wsData = JSON.parse(msg.data);

            if(wsData.message_type == 'Refresh'){
               console.log(messages)
            };
         };
      };
   }, [websocket, messages]);

看起来您遇到了一个问题

依赖项数组中带有[websocket]的useEffect只有在websocket引用/值更改时才会更新。无论何时,函数都会在该时间点围绕消息创建一个闭包。因此,消息的价值将保持在该闭包内。如果消息在创建websocket后更新,它将永远不会更新onmessage回调函数中消息的值

要解决此问题,请将消息添加到依赖项数组。[WebSocket,消息]。这将确保useEffect回调始终具有消息的最新状态,而onmessage函数将具有消息的最新状态

 useEffect(() => {
      if(websocket != null){
         websocket.onmessage = (msg) => {
            let wsData = JSON.parse(msg.data);

            if(wsData.message_type == 'Refresh'){
               console.log(messages)
            };
         };
      };
   }, [websocket, messages]);
这是因为getMessages是一个异步函数。顺序如下:组件最初装载并初始化值->componentDidMount被调用意味着getMessages被异步函数调用!->您的webaocket被初始化并调用第二个useEffect,它读取消息的初始值->您的getMessages获取其响应并相应地设置消息

要使其按预期工作,请将第二个useEffect的依赖项数组设置为[websocket,messages]。

这是因为getMessages是一个异步函数。顺序如下:组件最初装载并初始化值->componentDidMount被调用意味着getMessages被异步函数调用!->您的webaocket被初始化并调用第二个useEffect,它读取消息的初始值->您的getMessages获取其响应并相应地设置消息


要使其按预期工作,请将第二个useEffect的依赖项数组设置为[websocket,messages]。

谢谢,这很容易谢谢,这很容易