【问题标题】:setState logs older value when attempted saving it to LocalStoragesetState 在尝试将其保存到 LocalStorage 时记录旧值
【发布时间】:2020-09-26 08:22:56
【问题描述】:

即使有解决这个问题的方法,我也想了解为什么我下面的当前方法不成功。我想知道为什么本地存储记录状态的先前值,即使它与setState 绑定?

说明:

有一个带有 onChange 功能的输入字段,用于检查用户何时键入并将其正确保存到 localStorage。

<input required type="text" className="form-control" id="hotelName" name="hotelName" onChange={this.onInputChange} />

onInputChange(event) {
    localStorage.setItem('hotelCreateStep1', JSON.stringify(event.target.value));
}

情况:

因此,当它打算将 event.target.value 写入状态对象之前,然后将其写入 localStorage,如下所述,它会写入对象的先前值(仅丢失最后键入的字母或任何类型的输入尝试)。

onInputChange(event) {
    this.setState({
        hotelCreateStep1:{
            ...this.state.hotelCreateStep1,
            [event.target.name]: event.target.value
        }
    });
    localStorage.setItem('hotelCreateStep1', JSON.stringify(this.state.hotelCreateStep1));
}

【问题讨论】:

    标签: reactjs events local-storage onchange setstate


    【解决方案1】:

    setState 在 react 中是异步的。因此,每当您调用 setState 时,该值本身就不会得到反映。有关setStatecallback 的更多信息,请参阅here

    所以问题可以通过两种方式解决

    • 使用setState 回调来更新localStorage,如下所示
    onInputChange(event) {
        this.setState({
            hotelCreateStep1:{
                ...this.state.hotelCreateStep1,
                [event.target.name]: event.target.value
            }
        }, () => {
        localStorage.setItem('hotelCreateStep1', JSON.stringify(this.state.hotelCreateStep1))
      });;
    }
    
    • 或者直接在localStorage中使用event.target.value
    onInputChange(event) {
        this.setState({
            hotelCreateStep1:{
                ...this.state.hotelCreateStep1,
                [event.target.name]: event.target.value
            }
        });
        localStorage.setItem('hotelCreateStep1', event.target.value);
    }
    

    【讨论】:

      【解决方案2】:

      那是因为setState() 是异步的。使用回调函数来实现。

      onInputChange(event) {
        this.setState({
          hotelCreateStep1:{
            ...this.state.hotelCreateStep1,
            [event.target.name]: event.target.value
          }
        }, 
          () => localStorage.setItem('hotelCreateStep1', JSON.stringify(this.state.hotelCreateStep1))
        );
      }
      

      我最近写了一篇关于这个的帖子。检查here

      【讨论】:

      • 谢谢你,即使我知道你的答案首先,我应该给后一个答案投票,因为你提供的确切答案缺少大括号并且它已正确应用它们。很高兴阅读您的文章。
      • 这不是花括号的问题,而是 setItem 方法调用后的分号。我已经对其进行了编辑,现在它也应该可以在没有花括号的情况下使用。我的错。我很高兴能帮上忙:)
      • 我认为你放错了callback,即使你的意图是真实的。因为它被放置在setStates 花括号中,所以我不得不将函数移出该范围并以这种方式工作,因为它仍然有这个错位。
      • 是的,你是对的。我不得不在我的 IDE 中打开这段代码,它确实有错位。我再次编辑了我的帖子,以免留下包含错误的代码
      猜你喜欢
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 2016-08-15
      • 2020-08-08
      • 1970-01-01
      相关资源
      最近更新 更多