简体   繁体   English

React从localStorage获取对象,无法使用react useState设置它

[英]React getting an object from localStorage, can't set it with react useState

I have the following code for App.js.我有以下 App.js 代码。 The useEffect hook will run at startup of the App, and I expect it to retrieve an object from localStorage and then set it to the useState user variable. useEffect 钩子将在应用程序启动时运行,我希望它从 localStorage 检索一个对象,然后将其设置为 useState 用户变量。

CONSOLE.LOG OUTPUT: CONSOLE.LOG 输出:

JSON user {"name":"tester","username":"test username","password":"testpassword","token":"test token"} JSON 用户 {"name":"tester","username":"test username","password":"testpassword","token":"test token"}

parsed user {name: 'tester', username: 'test username', password: 'testpassword', token: 'test token'}解析用户 {name: 'tester', username: 'test username', password: 'testpassword', token: 'test token'}

current logged in user: null当前登录用户:null

 const App = (props) => { const [user, setUser] = useState(null); useEffect(() => { // CHECK IF THERE IS A LOGGED IN USER FROM PREVIOUS SESSIONS const loggedUserJSON = window.localStorage.getItem("loggedInUser"); if (loggedUserJSON) { console.log("JSON user", loggedUserJSON); const parsedUser = JSON.parse(loggedUserJSON); console.log("parsed user", parsedUser); setUser(parsedUser); } console.log("current logged in user: ", user); }, []);

And the following is the event handler for my login component:以下是我的登录组件的事件处理程序:

 const login = async (event) => { event.preventDefault(); try { const user = await UserService.login({ username: username, password: password, }); window.localStorage.setItem("loggedInUser", JSON.stringify(user)); history.push("/home"); } catch (exception) { console.log(exception); } };

Now I can see that the object goes into the browser's local storage correctly, and I can even properly parse it based on my console.log output.现在我可以看到该对象正确进入浏览器的本地存储,我什至可以根据我的 console.log 输出正确解析它。 But somehow但不知何故

setUser(parsedUser);

doesn't work.不起作用。 It gives the default value of null.它给出了默认值 null。 What makes the setUser to fail?是什么让 setUser 失败?

setUser useState function will not instantly assign the value to user like user = parsedUser it is working different, it will only set your value in it next render, setUser useState 函数不会像user = parsedUser那样立即将值分配给用户,它的工作方式不同,它只会在下一次渲染中设置您的值,

check the answer in this link.检查此链接中的答案。

useState set method not reflecting change immediately useState set 方法不会立即反映更改

Solution解决方案

Either you can check the value on its next render, or you can check the change in one another useEffect您可以在下一次渲染时检查该值,也可以检查另一个 useEffect 中的更改

const App = (props) => {
  const [user, setUser] = useState(null);

  useEffect(() => {
    // CHECK IF THERE IS A LOGGED IN USER FROM PREVIOUS SESSIONS
    const loggedUserJSON = window.localStorage.getItem("loggedInUser");
    if (loggedUserJSON) {
      console.log("JSON user", loggedUserJSON);
      const parsedUser = JSON.parse(loggedUserJSON);
      console.log("parsed user", parsedUser);
      setUser(parsedUser);
    }
    console.log("current logged in user: ", user); // this will only print null because `setUser(parsedUser)` is not yet reflected 
  }, []);
console.log("current logged in user on every render: ", user);  // this will console the value on its second render, becase second render happens when ` setUser(parsedUser);` completed
}

Another method to check the change is use one another useEffect检查更改的另一种方法是使用另一个useEffect

const App = (props) => {
  const [user, setUser] = useState(null);

  useEffect(() => {
    // CHECK IF THERE IS A LOGGED IN USER FROM PREVIOUS SESSIONS
    const loggedUserJSON = window.localStorage.getItem("loggedInUser");
    if (loggedUserJSON) {
      console.log("JSON user", loggedUserJSON);
      const parsedUser = JSON.parse(loggedUserJSON);
      console.log("parsed user", parsedUser);
      setUser(parsedUser);
    }
    console.log("current logged in user: ", user); // this will only 
   print null becase `setUser(parsedUser)` is not yet reflected 
  }, []);
  useEffect(()=> {
     console.log("current logged in user on every render: ", user);  // this will console the value every time user value changes intially it will be null and on second time it will show your data
  },[user])
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM