javascript - 等待所有 setStates 完成更新
问题描述
在我的父组件中,我渲染了多个子组件以及一个保存按钮。单击保存按钮时,将调用以下方法:
submit() {
validateControls();
}
validateControls() {
for (var key in this.refs) {
let ref = this.refs[key];
ref.setState({ force: true });
}
}
validateControls 方法理想情况下应该遍历所有 refs,并为每个组件调用 setState。设置此状态,将强制组件重新渲染并在组件内完成验证时验证自身。
子组件如果无效则有一个类名“invalid”,所以最后调用 validateControls() 后,submit 方法会检查是否存在名为“invalid”的类,如果存在则页面无效。
但是,我遇到的问题是 for 循环没有等待 setState 完成,因此当 validateControls() 方法完成时,没有一个控件具有“无效”作为类名。
有没有办法等待 setState 完成然后进入 for 循环中的下一个循环?
解决方案
如果您将函数作为 的最后一个参数传递setState
,则将在设置状态后调用该函数。
这是一个例子:
async submit() {
await validateControls();
}
async changeRefState(ref) {
return new Promise(resolve => {
ref.setState({ force: true }, resolve);
})
}
async validateControls() {
for (var key in this.refs) {
await this.changeRefState(this.refs[key])
}
}
无论如何,使用引用与子组件交互并不是最好的方法,最好通过 props 来做到这一点。
推荐阅读
- c# - 我使用 Visual Studio Community 进行学习是否合法?
- kubernetes - 错误:添加选择器后`选择器`与模板`标签`不匹配
- java - 建模一个复数,我在创建我的类时缺少一个 main 方法。有人可以指导我如何解决它吗?
- saml-2.0 - 我可以使用 ITfoxtec saml2 将 SAML 身份提供者添加到非核心网站吗?
- nginx - 客户端在 60 秒时从我的 flask/gunicorn/nginx-ingress 堆栈中收到 RemoteDisconnected 错误。为什么?超时设置...没有
- r - 如何将变量从 data.frame 循环到另一个到单个列中
- php - 转换 nvarchar 值时 Laravel 转换失败
- swift - 为什么 Swift 不会自动处理内存泄漏?
- javascript - 尝试制作一个当结果为负数时显示红色文本的计算器
- node.js - 重新启动使用 pm2-runtime 运行的 Node 应用程序会导致容器消失,但应用程序仍在运行