React Hook 设置值在内部不起作用 EventSource.onmessage
React Hook set value not working inside EventSource.onmessage
我将在下面展示我的 React 项目的 SSE 部分的简化版本。
出于某种原因,我无法更改 EventSource.onmessage 函数中变量的状态。
function App() {
const [variable, setVariable] = useState("qwerty");
const mockFunc = () => {
let eventSource = new EventSource("http://localhost:5000/stream");
eventSource.onmessage = function (e) {
console.log("variable:", variable);
setVariable("abc");
};
};
useEffect(() => {
console.log("UseEffect: ",variable);
}, [variable]);
return (
<div>
<button onClick={mockFunc}>updateVariable</button>
</div>
);
}
export default App;
从 Flask 端,我每 5 秒发送一条消息,并在 React 端成功接收到它。但是,出于某种原因,setVariable
无法正常工作,因为 variable
的值实际上并未被设置。这是程序生成的日志。
variable: qwerty
UseEffect: abc
variable: qwerty
variable: qwerty
variable: qwerty
..不确定
也就是说,setVariable不仅不会多次触发useEffect,它实际上是将值重置为原来的setState(?)。
这对我来说没有任何意义。如果我创建一个按钮来使用 setVariable 更改变量值,它工作正常,所以我不明白为什么它不能以这种方式工作。
提前致谢
这是 onmessage
回调处理程序中 variable
状态值的陈旧外壳。
您可以使用 React 引用和 useEffect
挂钩来缓存 variable
状态值并在 onmessage
回调中访问缓存的值。
示例:
function App() {
const [variable, setVariable] = useState("qwerty");
const variableRef = useRef();
useEffect(() => {
variableRef.current = variable;
}, [variable]);
const mockFunc = () => {
let eventSource = new EventSource("http://localhost:5000/stream");
eventSource.onmessage = function (e) {
console.log("variable:", variableRef.current);
setVariable("abc");
};
};
useEffect(() => {
console.log("UseEffect: ", variable);
}, [variable]);
return (
<div className="App">
<button onClick={mockFunc}>updateVariable</button>
</div>
);
}
日志输出:
我将在下面展示我的 React 项目的 SSE 部分的简化版本。
出于某种原因,我无法更改 EventSource.onmessage 函数中变量的状态。
function App() {
const [variable, setVariable] = useState("qwerty");
const mockFunc = () => {
let eventSource = new EventSource("http://localhost:5000/stream");
eventSource.onmessage = function (e) {
console.log("variable:", variable);
setVariable("abc");
};
};
useEffect(() => {
console.log("UseEffect: ",variable);
}, [variable]);
return (
<div>
<button onClick={mockFunc}>updateVariable</button>
</div>
);
}
export default App;
从 Flask 端,我每 5 秒发送一条消息,并在 React 端成功接收到它。但是,出于某种原因,setVariable
无法正常工作,因为 variable
的值实际上并未被设置。这是程序生成的日志。
variable: qwerty
UseEffect: abc
variable: qwerty
variable: qwerty
variable: qwerty
..不确定
也就是说,setVariable不仅不会多次触发useEffect,它实际上是将值重置为原来的setState(?)。
这对我来说没有任何意义。如果我创建一个按钮来使用 setVariable 更改变量值,它工作正常,所以我不明白为什么它不能以这种方式工作。
提前致谢
这是 onmessage
回调处理程序中 variable
状态值的陈旧外壳。
您可以使用 React 引用和 useEffect
挂钩来缓存 variable
状态值并在 onmessage
回调中访问缓存的值。
示例:
function App() {
const [variable, setVariable] = useState("qwerty");
const variableRef = useRef();
useEffect(() => {
variableRef.current = variable;
}, [variable]);
const mockFunc = () => {
let eventSource = new EventSource("http://localhost:5000/stream");
eventSource.onmessage = function (e) {
console.log("variable:", variableRef.current);
setVariable("abc");
};
};
useEffect(() => {
console.log("UseEffect: ", variable);
}, [variable]);
return (
<div className="App">
<button onClick={mockFunc}>updateVariable</button>
</div>
);
}
日志输出: