【问题标题】:can not update state with immutability helper无法使用不变性助手更新状态
【发布时间】:2019-10-23 03:17:06
【问题描述】:

我的状态中有对象,父对象中有嵌套对象,更新状态中的对象可能会导致状态变化,并且建议使用不可变助手的许多答案,(react-addons-update) 这是我的状态:

    this.state = {
        room: {
            isOpen: false,
            index: '',
            roomNumber: '',
            reserved: '',
            isLux: null,
            _id: '',
            reserver:{
               name: '',
               surname: '',
               national_id: '',
               customer_number: '',
               staying_til: '',
               _id: ''
            }

        }
    }

这就是更新房间属性的方式:

roomChangeEvent(e){
       update(this.state, {
            room: {
               [e.target.name]: {$set: e.target.value}

            }
       })
}

和储备属性

changeEvent(e){
        update(this.state, {
            room: {
                reserver: {
                  [e.target.name]: {$set: e.target.value}
                }

            }
       })
}

但即使它正在获取值和名称,它也不会更新状态。什么问题?

【问题讨论】:

标签: javascript reactjs immutability immutability-helper


【解决方案1】:

我会说,使用immer-js https://immerjs.github.io/immer/docs/produce

这非常简单,无需像immutability-helpers、$push、$set 等那样学习 api。

这是他们页面中的示例

import produce from "immer"

const baseState = [
    {
        todo: "Learn typescript",
        done: true
    },
    {
        todo: "Try immer",
        done: false
    }
]

const nextState = produce(baseState, draftState => {
    draftState.push({todo: "Tweet about it"})
    draftState[1].done = true
})

在你的场景中

import produce from "immer"

changeEvent(e){
   this.setState(produce(draftState => {
      draftState.room.reserver[e.target.name] = e.target.value;
   }););
}

【讨论】:

  • React 例子中的状态不需要取,直接用curried produce function即可。
  • 虽然,没有 immer 库的代码量是一样的,所以我对任何人说只要学习如何在 JS 中进行不可变的更改,有很多已经有资源了,最后也没那么难。
  • @EmileBergeron 感谢分享知识
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2021-12-10
相关资源
最近更新 更多