Javascript Can';t使用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

我正在尝试在寄存器功能组件中使用useState更新组件的状态 当用户输入无效的电子邮件地址并单击“提交”按钮时, 下面的代码将返回一条错误消息

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]})
非常感谢!