javascript - React - 在一个功能组件中,使用钩子,我可以在一个 setState() 成功更改状态后执行一段代码吗?
问题描述
setState
异步更新状态。据我了解,在使用类组件时,您可以执行以下操作以确保在setState
更新状态后执行某些代码:
setState({color: red}, callbackThatExecutesAfterStateIsChanged);
我正在使用功能组件和挂钩。我知道,在这里,每次状态更改后和初始执行useEffect()
时都会执行回调。color
useEffect(callback, [color]);
如何复制与类组件示例类似的行为 - 也就是说,在一个成功更改状态而不是在初始执行时执行一次代码块? setState()
解决方案
如果你问我,使用钩子没有安全的方法来做到这一点。问题是您都必须阅读并设置initialized
状态才能忽略第一次更新:
const takeFirstUpdate = (callback, deps) => {
const [initialized, setInitialized] = useState(false);
const [wasTriggered, setWasTriggered] = useState(false);
useEffect(() => {
if (!initialized) {
setInitialized(true);
return;
}
if (wasTriggered) {
return;
}
callback();
setWasTriggered(true);
}, [initialized, wasTriggered]);
};
虽然钩子看起来很有效,但它会setInitialized(true)
在开始时通过调用再次触发自身,因此也会触发回调。
您可以从 deps 数组中删除初始化值,并且该钩子现在可以工作 - 但是这会导致exhaustive-deps
linting 错误。hook 将来可能会中断,因为它不是 hooks api 的“官方”用法,例如,React 团队正在处理的并发渲染功能的更新。
推荐阅读
- python - 我制作的按钮在 pygame 中跳过了一个表面
- vb.net - ORA-01858: 在需要数字的地方发现了一个非数字字符 - VB.NET
- c# - 在选项卡控件中找不到动态选项卡页
- time-series - Grafana 与 prometheus 数据源错误值
- express - 与 3D Secure 的条带集成
- bash - 带有未知空格的关键字后的 grep 文本并删除注释
- html - 可折叠侧导航
- android - Android Recyclerview 项目并排
- fpga - Zynq SOC 无法通过交换机向桌面发送原始以太网数据包
- c - C程序更改网络适配器的MAC地址