reactjs - 使用异步/等待延迟状态更改?
问题描述
我正在制作一个在各种情况下弹出的自定义错误窗口。我正在努力解决的问题是让窗口在 2 秒后消失。active:false
由于偶数循环的工作方式(我认为?),只需一个简单的 setTimeout 即可将弹出状态更改为有点不可靠。
所以我正在尝试一种异步/等待方式来确保它总是正好 2 秒。然而,我在计时之下完成的方式似乎仍然很奇怪,有时是瞬间的,有时是 2 秒。
如何让我的removeErrorMsg
函数在设置状态之前等待 2 秒?
///// App.js.js ////
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
export default class App extends Component {
state = {
errorPopup: {
active: false,
message: ''
}
}
removeErrorMsg = async() => {
await delay(2000);
this.setState({errorPopup: {active: false, message: ''}});
}
}
///// ErrorPopup.js ////
import React from 'react'
const ErrorPopup = ({ message, active, removeErrorMsg}) => {
if(active){
removeErrorMsg()
return (
<div className="error-popup">
<p>{message}</p>
</div>
)
} else return <div></div>
}
export default ErrorPopup
解决方案
您必须在函数内调用removeErrorMsg
组件ErrorPopup
内部useEffect
。直接调用它会导致另一个延迟被创建,一旦父组件中的任何其他操作尝试触发重新渲染导致意外行为,它就会重置状态
const ErrorPopup = ({ message, active, removeErrorMsg}) => {
useEffect(() => {
if(active) {
removeErrorMsg()
}
}, [active])
if(active){
return (
<div className="error-popup">
<p>{message}</p>
</div>
)
} else return <div></div>
}
PS虽然不保证 setTimeout 会在 2 秒后立即执行,但或多或少大概会在 2 秒左右执行。
推荐阅读
- sql - 如何将array_agg之后的整数数组转换为IN子句的值
- whitespace - 如何在 sphinx 文档中显式呈现空格?
- json - 自定义连接器(JSON 结果转换为参数)
- system-verilog - 在systemverilog中实现关联数组队列的正确方法是什么?
- php - 如何在 WooCommerce 中四舍五入价格?
- excel - 在各个单元格中显示结果,而不是弹出消息框
- javascript - 文本轮播过渡
- javascript - 在一个组件中导入 CSS 就是将 CSS 影响添加到其他组件。如何和为什么?
- regex - 正则表达式找到具有优先顺序的匹配项?
- apache-spark - Spark 无法以分区和追加模式写入新的配置单元表