React中setState修改深層物件

範東洋發表於2018-11-12
在React中經常會使用到setState,因為在react生態中,state就是一切.在開發過程中,時長會在state中遇到一些比較複雜的資料結構,類似下面這樣的:
state = {
     list: {
        objA: {
          name: `A`,
          age: 20
        },
        objB: {
          name: `B`,
          age: 25
        },
        objC: {
          show: false
        },
        objD: `D`
      }
}

這時需要我們修改listobjA中的name屬性和objD的屬性,遇到這樣的情況我們一般會使用什麼辦法解決呢?其實有三種解決方案:

方案一(作用於物件中的深層級和第一層級):

  this.setState({
     list: {
         ...this.state.list,
          objA: {
             ...this.state.list.objA,
                  name: `A1`
                }
              }
            })

方案二(作用物件中的第一層級):

  let data = Object.assign({}, this.state.list, {objD: `D1`})
    this.setState({
              list: data
            })

方案三(作用於物件中的深層級和第一層級):

  let data = this.state.list;
      data.objA.name = `A1`;
      data.objD = `D1`;
      this.setState({
              list: data
            })

總結:

| 方案 | 適用範圍 | 缺點
| :-: | :-: | :-: |
| 方案一 |多層級和單一層級都存在 | 寫法麻煩,單次物件賦值,物件層級多的時候,容易遺漏
| 方案二 |只適用與第一層級 | 只適用第一層級
| 方案三 |多層級和單一層級都存在 | 若存在深層及和單一層級的,需要多次賦值

這三種寫法都可以,使用哪一種方案,還需要根據業務來定.希望看了之後,能給大家帶來一些幫助,謝謝.


相關文章