【问题标题】:localStorage does not persist data on refreshlocalStorage 不会在刷新时保留数据
【发布时间】:2018-06-06 02:37:20
【问题描述】:

我正在构建一个基于 React-Router 的天气应用程序,在该应用程序中,我在图块上展示了五天的预报。在点击一个实际上是 React Router 的链接的图块后,用户会看到另一个组件(天气),它显示了有关所选日期的更详细信息。因此,路径更改为 localhost:3000/w/:{dateId}。但是,问题是,如果我刷新页面,它会崩溃,因为它没有用于显示的数据。我将 localStorage 合并到其中:

当用户输入城市名称并点击回车时:

    handleFormSubmit = () => {
    geocodeByAddress(this.state.address)
      .then(results => getLatLng(results[0]))
      .then(latLng => {
        const lat = latLng.lat;
        const lng = latLng.lng;
        this.setState({
          lat,
          lng
        });
        fetch(
          `https://api.openweathermap.org/data/2.5/forecast?lat=${lat}&lon=${lng}&appid=${API_KEY}&units=metric`
        )
          .then(response => response.json())
          .then(data => {
            const dataWeather = data;
            this.setState({
              data: dataWeather.list,
              refresh: false
            });
            localStorage.setItem("weather", JSON.stringify(data));
          });
      })
      .catch(error => console.error("Error", error));
  };

以及随后在 componentDidMount 中调用的两个函数:

   hydrateStateWithLocalStorage() {
    for (let key in this.state) {
      if (localStorage.hasOwnProperty(key)) {
        let value = localStorage.getItem(key);
      }
      try {
        let value = JSON.parse(value);
        this.setState({ [key]: value });
      } catch (e) {
        let value = ""
        this.setState({ [key]: value })
      }
    }
  }

  saveStateToLocalStorage() {
    for (let key in this.state) {
      localStorage.setItem(key, JSON.stringify(this.state[key]))
    }
  }

但是,这不能正常工作,因为当我刷新页面时(在特定的 /w/:dateId 上)整个应用程序崩溃,即使在 Chrome DevTools 中的应用程序选项卡下它被正确显示。

我的 localStorage 有什么问题吗?

【问题讨论】:

  • 你能在写之前和读之前console.log位置吗?
  • hydrateStateWithLocalStoragefor循环之后定义value
  • @mplungjan,是的,它控制台记录了我之前搜索过的位置
  • @Vivek,我不太确定我知道你的意思是在哪里定义它
  • 它们是相同的主机和端口吗?

标签: javascript reactjs local-storage


【解决方案1】:

改变下面的函数-

问题:您在 iftry 块内重新声明了 value

  hydrateStateWithLocalStorage() {
    for (let key in this.state) {
      let value = null;
      if (localStorage.hasOwnProperty(key)) {
        value = localStorage.getItem(key);
      }
      try {
        value = JSON.parse(value);
        this.setState({ [key]: value });
      } catch (e) {
        value = ""
        this.setState({ [key]: value })
      }
    }
  }

【讨论】:

  • 我在 for 循环的一开始就删除了 value 的声明,但是问题仍然存在
  • @llievredemars 这是正确的并且符合我的回答,我只是认为您只想将值限制为 json,否则将其设置为空字符串
  • @llievredemars 然后你必须检查程序的初始化部分,因为我已经测试了上面的函数,它按预期工作
  • 没错,但是还是不能解决localstorage没有真正持久化状态的问题
猜你喜欢
  • 2021-03-19
  • 2022-11-12
  • 2022-12-06
  • 2022-01-01
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多