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]。谢谢,这很容易谢谢,这很容易