2016-10-27 19 views
12

Tôi đang cập nhật một đối tượng trong một mảng trong trạng thái React bằng cách sử dụng immutability helper.Cập nhật đối tượng mảng trong Trạng thái phản ứng bằng cách sử dụng trình trợ giúp bất biến

Đối tượng tôi muốn thay đổi được lồng:

this.state = { 
    a: { 
    b: [{ c: '', d: ''}, ...] 
    } 
} 

Tôi muốn cập nhật những c prop bên trong phần tử thứ n của b sử dụng tính bất biến helper.

Mã tương đương mà không có sự trợ giúp tính bất biến là:

const newState = Object.assign({}, this.state); 
newState.a = Object.assign({}, newState.a); 
newState.a.b = newState.a.b.slice(); 
newState.a.b[n] = Object.assign({}, newState.a.b[n]); 
newState.a.b[n].c = 'new value'; 
this.setState({ newState }); 

Tôi biết các mã trên là một chút xấu xí. Tôi giả sử mã bằng cách sử dụng helper bất biến sẽ giải quyết vấn đề của tôi. Cảm ơn

+1

Xem xét sử dụng ImmutableJS. –

Trả lời

15

Một cách để làm điều đó sẽ được sử dụng $set

let index = 0; 
let newState = update(this.state, { 
    a: { 
    b: { 
     [index]: { 
       c: { $set: "new value"} 
     } 
    } 
    } 
}); 
this.setState(newState); 

jsfiddle

+0

Có cập nhật trả về một đối tượng/yếu tố mới như abc = Object.assign ({}, xyz) hay nó thay đổi đối tượng được đưa ra làm tham số tại chỗ ?? –

+0

@VrajSolanki Đối với ví dụ này, nó sẽ trả về đối tượng trạng thái mới, với đối tượng 'a' mới (các khóa còn lại giống nhau, tham chiếu cũ), với mảng' b' mới trong đó, tất cả các tham chiếu phần tử sẽ không bị thay đổi mà là ' [index] 'một. Và với tham chiếu mới cho 'c', phần còn lại sẽ là tài liệu tham khảo cũ. – Wish

2

Im nhập khẩu update từ tính bất biến helper đây :)

this.state = { 
    a: { 
    b: [{ c: '', d: ''}, ...] 
    } 
} 


this.setState(update(this.state, { 
    a: { 
     b: { 
      $apply: b => b.map((item, ii) => { 
       if(ii !== n) return item; 
       return { 
        ...item, 
        c: 'new value' 
       } 
      }) 
     } 
    } 
}) 
Các vấn đề liên quan