【问题标题】:Local Storage values not getting loaded in React App本地存储值未在 React App 中加载
【发布时间】:2021-04-14 17:00:45
【问题描述】:

我是 React 的新手,正在关注 Udemy 上的一个视频系列(Brad Schiff 为我们其他人准备的 React)。作者为用户登录等提供了后台系统。 当用户登录时,后端服务器发送 3 个值以响应成功登录:登录令牌、用户名和头像 url(来自 gravatar.com 的虚拟图像)。然后将这些值存储在本地存储中,从那里它们可以显示在 UI 上:

    const response = await axios.post("http://localhost:8080/login", {username, password});

    if (response.data) {
        // if response contains token, set login flag to true
        props.loginFlagHandler(true);

        // save user token, username, avatar in localstorage
        localStorage.setItem("username", response.data.username);
        localStorage.setItem("loginToken", response.data.token);
        localStorage.setItem("avatar", response.data.avatar); }

现在,当我登录并更新 UI 时,从服务器接收到的值已成功存储在浏览器的本地存储中,但它们没有反映在 UI 上。头像图片未加载,应显示用户名的欢迎消息未按预期工作(请参见下面的第一张图片)。欢迎消息应为“您好 用户名>,您的提要为空”

但是,一旦我点击刷新,头像图像和用户名都会按原样显示在相关位置。 (参考第二张图片)。

在这两种情况下,我指的是 localStorage 变量,如下所示:

<img className="small-header-avatar" src={localStorage.getItem("avatar")} />

还有:

<h2 className="text-center">
  Hello <strong>{localStorage.getItem("username")}</strong>, your feed is empty.
</h2>

我认为这应该是我在这里想念的菜鸟。不过,提前致谢:

【问题讨论】:

  • 我的猜测是 - 组件不会自行刷新,因为它没有理由这样做。本地存储中的数据已更改,但您的组件不知道该更改。手动刷新会强制组件重新渲染自己。
  • 你能提供你的react组件的代码吗?
  • http请求成功后页面是否刷新并重定向到auth路由?
  • 如果你的应用使用像 React Router 这样的路由库,组件从 localstorage 读取数据的一种方法是延迟加载,因为组件渲染在 localStorage 保存数据之前首先出现。

标签: reactjs local-storage


【解决方案1】:

在React中,当组件挂载时

  1. 状态正在加载
  2. UI 打印初始状态
  3. 生命周期挂钩运行(例如useEffect)并更新状态
  4. DOM 以更新的状态重新打印

如果您不在组件中使用状态,那么您应该按照上述工作流程来更新您的 UI。虽然我不知道你的props.loginFlagHandler(true) 是做什么的,但我在下面举个例子。

const [isDataStored, setIsDataStored] = useState(false)

useEffect(() => {
  const fetchData = async () => {
    const response = await axios.post("http://localhost:8080/login", {username, password});

    if (response.data) {
      // if response contains token, set login flag to true
      props.loginFlagHandler(true);

      // save user token, username, avatar in localstorage
      localStorage.setItem("username", response.data.username);
      localStorage.setItem("loginToken", response.data.token);
      localStorage.setItem("avatar", response.data.avatar);
    }
    setIsDataStored(true)
  }
}, [])

您也可以尝试延迟加载您的子组件。

【讨论】:

  • 感谢您抽出宝贵时间回复@miraj... . 再次感谢。
【解决方案2】:

那么你应该使用这样的状态。

const [avatar, setAvatar] = useState("");
const [username, setUsername] = useState("");

useEffect(() => {  
      setUsername(localStorage.getItem("username"))
      setAvatar(localStorage.getItem("avatar"))
    
  
})

................
<img className="small-header-avatar" src={avatar} />
And:

<h2 className="text-center">
  Hello <strong>{username}</strong>, your feed is empty.
</h2>

【讨论】:

  • 工作就像一个魅力...告诉你,这一定是我错过的菜鸟...谢谢一堆...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多