Javascript Can';t使用useState更新状态
我正在尝试在寄存器功能组件中使用useState更新组件的状态 当用户输入无效的电子邮件地址并单击“提交”按钮时, 下面的代码将返回一条错误消息Javascript Can';t使用useState更新状态,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我正在尝试在寄存器功能组件中使用useState更新组件的状态 当用户输入无效的电子邮件地址并单击“提交”按钮时, 下面的代码将返回一条错误消息 let response= await axios.post("/api/user/register",new_user,config); 我想用这段代码将错误消息设置为formData let response= await axios.post("/api/user/register",ne
let response= await axios.post("/api/user/register",new_user,config);
我想用这段代码将错误消息设置为formData
let response= await axios.post("/api/user/register",new_user,config);
if(response.data.errnum!==0){
setFormData({...formData,errors:response.data.message})
console.log(formData);
}
但是errors的值是空的,如下所示
如何将错误消息设置为formData
这是我的密码:
import React,{useState}来自“React”
从“axios”导入axios
函数寄存器(){
常量[formData,setFormData]=useState({
姓名:“,
电邮:“,
密码:“”,
密码2:“”,
错误:{}
});
const{name,email,password2}=formData;
const setValue=e=>setFormData({…formData[e.target.name]:e.target.value})
const submitData=async(e)=>{
e、 预防默认值();
如果(密码!==密码2){
console.log(“密码不匹配”);
}否则{
让新用户={name,email,password,}
试一试{
让配置={
标题:{
“内容类型”:“应用程序/json”
}
}
let response=wait axios.post(“/api/user/register”,new_user,config);
if(response.data.errnum!==0){
setFormData({…formData,错误:response.data.message})
console.log(formData);
}
}捕获(错误){
控制台错误(error);
}
}
}
返回(
注册
创建您的帐户
提交数据(e)}>
设置值(e)}
必需的/>
设置值(e)}
值={email}
name=“电子邮件”/>
这个网站使用Gravatar,所以如果你想要个人资料图像,请使用aGravatar电子邮件
设置值(e)}
值={password}
name=“密码”
minLength=“6”
/>
设置值(e)}
值={password2}
name=“password2”
minLength=“6”
/>
已经有账户了吗?
)
}
导出默认寄存器
我认为您所做的错误是将对象保存在另一个对象中
const [formData,setFormData]=useState({
name:"",
email:"",
password:"",
password2:"",
errors:{}
});
formData是一个对象,而errors也是一个对象。为了找到更好的方法,请为错误创建一个单独的状态,并将通过这些消息产生的所有错误附加到error对象中。
如果您在定义错误的对象中写入消息,它将给您错误消息
errors:{"hi","bye"}
您的代码中没有问题。您要做的是在设置
状态时立即对其进行控制台操作
setState
是异步的,这意味着您不能在一行上调用它,而假定在下一行上状态已更改
如果你查一下
setState()
不会立即改变此.state,但会创建挂起的状态转换。调用此方法后访问this.state
,可能会返回现有值。无法保证对setState调用的同步操作,并且可能会对调用进行批处理以提高性能
我建议您使用useffect
,然后检查您所在州的数据变化
useEffect(() => {
console.log(formData)
}, [formData])
试试setState(prevValue=>({…prevValue,key:value}))
谢谢你的回答。我试过了,但没用setFormData(prevValue=>({…prevValue,错误:response.data.message}))
man react不会立即更新tigger状态它是异步发生的,所以您需要使用useEffect检查状态更新,如下所示:useEffect(()=>{console.log(formData)},[formData]})
非常感谢!