Javascript 为什么不';不要更新数据
我尝试用获取的数据更新useState中的值。 当I控制台记录数据。成功时,它返回真。然后我将其分配给成功值。但它返回的值为false!为什么?为什么价值成功没有立即得到更新。最后,我从服务器收到了登录成功的消息。 登录成功:false 用户管理员已登录Javascript 为什么不';不要更新数据,javascript,reactjs,async-await,react-hooks,Javascript,Reactjs,Async Await,React Hooks,我尝试用获取的数据更新useState中的值。 当I控制台记录数据。成功时,它返回真。然后我将其分配给成功值。但它返回的值为false!为什么?为什么价值成功没有立即得到更新。最后,我从服务器收到了登录成功的消息。 登录成功:false 用户管理员已登录 const Signin = () => { const [values, setValues] = useState({ success: false }); const { success } = values;
const Signin = () => {
const [values, setValues] = useState({
success: false
});
const { success } = values;
const clickSubmit = async event => {
event.preventDefault();
const signReact = catchAsync(async (email, password) => {
const data = await signin(email, password) // fetch data from the server
console.log(data.success); // -> true
if (data) {
setValues({
...values, success: data.success // -> assign to success
});
console.log("SIGN IN success: " + success); // -> false! why?!
}
return data;
});
signReact(email, password);
};
setState()
是一个异步函数。因此,您无法在下一条语句中打印它。这需要一些时间。要查看更新的状态值,您可以像这样登录到useffect()
useEffect(()=>{
console.log(values);
},[values])
根据文件:
对setState的调用是异步的-不要依赖this.state在调用setState后立即反映新值。如果需要基于当前状态计算值,请传递更新程序函数而不是对象:
例如:
const Signin=()=>{
const[values,setValues]=useState({
成功:错
});
const{success}=值;
React.useffect(()=>{
console.log(“登录成功:+success”);
},[价值];
const clickSubmit=异步事件=>{
event.preventDefault();
const signReact=catchAsync(异步(电子邮件、密码)=>{
const data=wait sign(电子邮件、密码)//从服务器获取数据
console.log(data.success);//->true
如果(数据){
设定值({
…值,成功:data.success/->分配给成功
});
}
返回数据;
});
signReact(电子邮件、密码);
};
使用。尝试以下方法:
useEffect(() => {
console.log("SIGN IN success: " + values.success);
}, [values]);
...
...
const data = await signin(email, password);
setValues(prevState =>{...prevState, success: data.success});
setState()是一个异步函数。它不会立即更新检查此解决方案似乎就是您需要的解决方案问题是我需要更新值“success”以重定向页面。const redirect=()=>{if(success){return;}好吧,这个问题是针对钩子的。您可以尝试在
api success
上重定向@MichalRutz,您可以将其编写为{values.success&&}
,因为只有success
为true时才会执行此操作