【问题标题】:How to load dynamically data from localStorage in React JS?如何在 React JS 中从 localStorage 动态加载数据?
【发布时间】:2021-03-11 14:25:41
【问题描述】:

我正在尝试动态显示存储在 localstorage 中的数据,这意味着当数据添加到 localstorage 时,它​​也应该同时显示在同一页面上。我有以下代码:

const [peopleInfo, getPeopleInfo] = useState(
        JSON.parse(localStorage.getItem("peopleInfo"))
    );

    const [objects, getObjectsList] = useState(
        JSON.parse(localStorage.getItem("objects"))
    );

    const setPeopleInfo = async () => {
        const people = await JSON.parse(localStorage.getItem("peopleInfo"));
        getPeopleInfo(people);
    };

    const getObjects = async () => {
        const object = await JSON.parse(localStorage.getItem("objects"));
        getObjectsList(object);
    };



    useEffect(() => {
        let isSubscribed = true;

        if (isSubscribed) {
            setPeopleInfo();
            getObjects();
        }

                return () => (isSubscribed = false);

    });

当 useEffect 不包含 getObject() 时:

  useEffect(() => {
        let isSubscribed = true;

        if (isSubscribed) {
            setPeopleInfo();
        }

                return () => (isSubscribed = false);

    });

代码工作正常,每次 localStorage 更改时 peopleInfo 都会更新,但是当我包含 getObjects() 和其他类似函数以获取所有必要数据时,应用程序崩溃而不显示错误。我不知道为什么。当我将 useEffect 与空 [] 一起使用时,除非我刷新页面,否则数据不会在 localStorage 更改时更新(这不是我想要的)。有人可以建议怎么做吗?

【问题讨论】:

    标签: javascript reactjs async-await local-storage


    【解决方案1】:

    根据您的代码 useEffect 调用,每次当您的状态发生变化时,如果您使用 [] 作为依赖项 useEffect 仅调用一次,但我意识到当您在 useEffect() 中调用 getObjects() 函数时,它每次都会更改状态时间让你的状态无限变化

     import React,{useState,useEffect} from "react";
        import "./style.css";
        
        export default function App() {
          const [objects, getObjectsList] = useState([{ name: "object1" }]);
        
          useEffect(() => {
             getObjectsList([{ name: "object1" }])
            console.log("loop executed");
          });
          return <div />;
        }
    

    所以我只是更改了一些代码

      import React, { useState, useEffect} from "react";
        import "./style.css";
        
            export default function App() {
              const [objects, getObjectsList] = useState([{ name: "object1" }]);
              useEffect(() => {
                setInterval(() => {
                  const localStorageValue = [{ name: "object2" }]; //JSON.parse(localStorage.getItem("objects"));
                  if (JSON.stringify(localStorageValue) !== JSON.stringify(objects)) {
                    getObjectsList(localStorageValue);
                  }
                }, [1000]);
              }, []);
            
              return <div />;
            }
    

    在此代码中,setInterval 每次检查您的本地存储是否更改它会更新您的状态

    【讨论】:

    • 对不起,这是一个错字。我编辑了我的代码。在我的应用程序代码中是正确的,状态是用 getObjectsList() 设置的,异步函数是 getObjects()。
    • 如果你检查你的 useEffect 调用多少次,我认为每次你的状态改变时你的 useEffect 调用就像一个无限循环
    • 有一个storage 事件可以监听。 当有事件或回调时,切勿使用setInterval 轮询值!
    • @FZs,存储事件未触发,因为数据在同一页面上存储和检索。你能举一个在这种情况下回调的例子吗?
    • 在这种情况下,您需要自己跟踪所有更改。创建一个包装localStorage.setItem() 的函数,并调用存储在全局函数数组(或Set)中的所有函数。然后,只需在每个组件/需要通知的任何内容中为该数组添加一个自定义函数。
    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2018-04-03
    相关资源
    最近更新 更多