javascript - React 没有捕获最新的函数回调
问题描述
在下面的示例中,子组件在单击按钮 5 秒后调用 onFinish 回调。问题是 onFinish 回调可以在这 5 秒内发生变化,但它会调用最后一个捕获的回调。
import React, { useState } from "react";
const Child = ({ onFinish }) => {
const [finished, setFinished] = useState(false);
const finish = async () => {
setFinished(true);
setTimeout(() => onFinish(), 5000);
};
return finished ? (
<p>Wait 5 seconds and increment while waiting.</p>
) : (
<button onClick={finish}>Click here to finish</button>
);
};
export default function App() {
const [count, setCount] = useState(0);
return (
<>
<p>Count: {count}</p>
<button onClick={() => setCount((c) => c + 1)}>Increment</button>
<Child onFinish={() => alert(`Finished on count: ${count}`)} />
</>
);
}
这个解决方法是用以下内容替换完成:
const cb = useRef();
cb.current = onFinish;
const finish = async () => {
setFinished(true);
setTimeout(() => cb.current(), 5000);
};
有没有更好的方法将回调更新为最新的?
解决方案
是的,您可以检查当前状态并将其与上一个状态进行比较,例如
setFinished((prevState) => newState)
推荐阅读
- excel-formula - 有没有办法从连接结果中删除空换行符?
- spring - Websphere - Spring 集成 SSL 问题
- python - 没有烧瓶 sqlalchemy 或 ORM 的烧瓶登录
- markdown - 使用 pandoc-citeproc 输出参考书目而不引用任何内容
- angular - Angular 7 - 服务和订阅
- reactjs - ReactTable中列的自定义排序方法
- c - 打印句子中每个单词的首字母
- jquery - Bootbox - Confirm Modal Dialog Box 需要回调函数……但我有一个
- android - ZXing中的摄像头找到二维码后如何重启
- avro - Apache Flume 中的 Apache Avro 模式验证