javascript - 无法在 React 中访问函数内部状态变量的正确值
问题描述
我在 React 中创建了一个表单,它有一个按钮,在验证输入数据后应该重定向到下一个表单。该按钮如下所示:
<Button type = "submit" onClick = {(event) => {validateData(event,"basicInfo")}} className = "button" variant="contained" color="secondary" style = {buttonStyle}>Validate Data</Button>
validateData 函数如下:
var validateData = (event,section) => {
props.handleSubmit(event,section);
console.log(props.errors); //Added to debug
//Following is the code I actually want to execute
/*if( !props.errors.firstName && !props.errors.lastName && !props.errors.email &&
!props.errors.address){
history.push("/resume-gen/education");
} */
}
在 validateData 中调用的 handleSubmit 函数具有验证逻辑,并在验证时更新状态变量错误。
这里的问题是 props.errors 没有显示为由在 validateData 函数中使用的 console.log() 记录的更新。console.log 的结果是:
{firstName: "", lastName: "", email: "", address: "", educationInfos: Array(1), …}
而它应该是
{firstName: "First Name is required.", lastName: "Last Name is required.", email: "Email is required.", address: "Address is required.", educationInfos: Array(1), …}
这是在第二次点击时记录的(但应该在第一次点击时发生)
从代码中的其他任何地方记录 props.errors 会给出更新的错误。因此,问题似乎出在函数 validateData 内部。此外,第一次单击按钮时会正确打印 props.errors 属性(打印在页面上)。我需要再次单击该按钮以获取从函数内部记录的错误的更新值。我不明白函数内部出了什么问题。我曾尝试在回调函数中登录,但无济于事。
解决方案
从给定的代码中,我可以确定调用
更新您传递给该组件props.handleSubmit(event,section);
的父状态。props
state
更新将导致您的父级重新渲染,这意味着您的Button
元素也将被重新渲染,只有这样您才能获得更新后的 props。
您实质上记录的是props.errors
当前渲染中可用的值。您无法获得最新值,因为validateData
正在关闭props
当前渲染的值。
在新的渲染validateData
上将再次创建并关闭更新 props的值。
props.errors
我想您可以先使用event
和section
作为参数来验证东西(如果可能),然后再调用props.handleSubmit(event,section);
和history.push("/resume-gen/education");
编码,而不是依赖于这里。
注意:-从其他任何地方进行日志props.errors
记录必须正常工作,因为您必须将其记录在Button
函数体内,每次重新渲染时都会有更新的值,这与可能导致更新但不包含更新值的事件处理程序不同,因为它们关闭超过以前重新渲染的那些。此外,如果Button
是类组件,那么您必须在render
方法中看到正确的值。
推荐阅读
- java - 是否可以在 @OnMessage 函数中使用 POJO 而不是字符串?
- python - 简单代码:如何定义测距变量?(代码错误)
- android - 有没有办法访问每个 RecyclerViewHolder?
- c# - 如何在 EF6 中确保序列化事务?
- spring - 为什么我们需要在spring中使用接口而不是直接从控制器中调用服务层
- azure-devops - AzureDevOps:通过添加已解决的字段和标签创建错误
- robotframework - 机器人框架中的多个 if/else 条件
- azure - 如何为 terraform kubernetes 部署上的虚拟机规模集启用托管标识
- r - 转换为 tidy 格式并在同一图中绘制四个密度图
- java - 一些 MyBatis SQL 连接保持打开