[英]React useState hook not updating within async useEffect
I want to overwrite user with the object I saved in localStorage, but its not working.我想用我保存在 localStorage 中的对象覆盖用户,但它不起作用。
Note, component is called Index because I'm using next.js注意,组件被称为Index因为我使用的是 next.js
import React, { useState, useEffect } from 'react';
import { loadUser } from '../utils/user';
const Index = () => {
const [ user, setUser ] = useState({});
async function restore(){
const loadedUser = await loadUser();
console.log(loadedUser); // correct - {userId: 4124783261364}
setUser(loadedUser);
console.log(user); // was not updated - {}
};
useEffect(() => {
restore();
}, [0])
return (<></>);
};
export default Index;
[]
) ( not [0]
), as a second argument.[]
)(不是[0]
)作为第二个参数。 This tells React that your effect doesn't depend on any values from props or state, so it never needs to re-run .console.log(user);
console.log(user);
doesn't show updated value next to setUser(loadedUser);
setUser(loadedUser);
旁边不显示更新的值setUser(loadedUser);
const restore = async () => {
const loadedUser = await loadUser();
console.log(loadedUser); // correct - {userId: 4124783261364}
setUser(loadedUser);
console.log(user); // user is not updated here, but will be
};
useEffect(() => {
restore();
}, []);
This is away from your problem since you just need to load user from local storage just one time.这远离您的问题,因为您只需要从本地存储加载用户一次。 But when
loadUser()
returns changing results by time so need to update user real time, you should use useCallback
.但是当
loadUser()
按时间返回变化的结果因此需要实时更新用户时,您应该使用useCallback
。
const updateUser = useCallback(async () => {
const loadedUser = await loadUser();
setUser(loadedUser);
}, []);
useEffect(() => {
updateUser();
}, [updateUser]);
Try something like this:尝试这样的事情:
// Assuming your loadUser() functions is set like the line below
const loadedUser = {userID: '513216351354'};
const Index = () => {
function restore(){
console.log("Loaded user is " + loadedUser.userID); // Loaded user is 513216351354
setUser(loadedUser.userID);
console.log("User is " + user); // User is 513216351354
};
useEffect(() => {
restore();
}, [])
return (<></>);
}
export default Index;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.