2016-04-24 3 views
2

Я пытаюсь добавить/нажимать объект javascript (назовем этот «сеанс») на this.state.sessions.Изменение состояния реакции при нажатии вложенного объекта

Я попробовал это двумя способами:
1) Concat'ing новый сеанс

this.setState({sessions: this.state.sessions.concat(session)}); 

2) Использование РЕАКТ неизменности хелперы

var newState = React.addons.update(this.state, { 
      sessions : { 
       $push : [session] 
      } 
     }); 
this.setState(newState); 

В то время как мелкие данные (например, sessions[i].location) добавляется правильно, проблема заключается в том, что все области предыдущего сеанса теперь установлены на новый session.scope. В приведенной ниже картинной ссылке вы можете увидеть, что значения области первого сеанса (sessions[0].scope) были перезаписаны значениями области второго сеанса (sessions[1].scope). Как обеспечить, чтобы при добавлении нового сеанса значения предыдущего сеанса не затрагивались?

App state picture

ответ

1

Я думаю, что это не имеет никакого отношения к реакции, и проблема может заключаться в том, что объект в sessions[0].scope копируется по ссылке. Этот объект scope может быть ссылкой, разделяемой между старыми и новыми значениями сеанса.

+0

Я отмечаю это как ответ. Хотя я не решил проблему на своей исходной кодовой базе, я создал более простое приложение (все еще с дочерними компонентами) и обновления области, как и ожидалось. – Kunal

1

sessions Поскольку массив, я бы сделал следующее:

addSession = (newSession) => { 
    let tempArray = this.state.sessions.slice(); 
    tempArray.push(newSession); 
    this.setState({sessions: tempArray}); 
} 

выше создает неполную копию sessions массива и помещает его во временную переменную. Затем он подталкивает новый сеанс в массив, и как только это будет сделано, мы перезапишем this.state.sessions новой переменной.

+0

Спасибо Крис, я дал вам предложение, но, увы, такая же проблема сохранилась, но я заметил следующую странность: я установил точку останова после 'let tempArray = this.state.sessions.slice();'. Я добавил два сеанса, один без полей «сеансы [0] .scope = []» и один с областью «сеансы» [1] .scope = [{id: 1, ...}] '. Странно, что tempArray уже применил область второго сеанса к первой области сеанса, то есть 'session [0] .scope == session [1] .scope. – Kunal

Смежные вопросы