2015-07-18 3 views
4

У меня есть следующий код в компоненте:immutable.js & react.js SetState очищает прототип объекта

constructor() { 
    this.state = Immutable.fromJS({ 
      user : { 
       wasChanged : false, 
       firstName : false, 
       lastName : false, 
       address : { 
        street : false, 
       } 
      } 
     }); 
} 
onEdit({target: {dataset: {target}}}, value) { 
     this.setState(function (prevState) { 
      return prevState.setIn(['user', target], value); 
     }); 
    } 
render() { 
    var user = this.state.get('user').toJS(); 
    ... 
} 

Проблема заключается в том, что, когда я пытаюсь обновить значение в onEdit Я вижу, что prevState имеет разные прототипы. Я не понимаю, почему и что я делаю неправильно. Я вижу это в консоли

> Object.getPrototypeOf(this.state) 
src_Map__Map {@@[email protected]@: true} 

> Object.getPrototypeOf(prevState) 
Object {} 

После того, как состояние изменилось оно переходит к визуализации, где она, конечно, не может найти получить функцию или что-нибудь из непреложных

Использование реагируют с аддонами 0.13.3.

+0

Это потому, что она должна быть простой объект с ключами и не фантазии Неизменное? –

+0

Любая конкретная причина, по которой вы хотите использовать 'immutable'? –

ответ

6

Поместите это как ключ в состояние.

this.state = { 
    data: Immutable... 
}; 

В настоящее время по этой причине вы не можете использовать Неизменный объект как состояние та же причина вы не можете сделать this.state = 7: это не обычный JavaScript объект.

Ориентировочно операция выглядит следующим образом:

React.Component.prototype.setState = (changes) => { 
    batchUpdate(() => { 
    // copies own properties from state to the new object 
    // and then own properties from changes to the new object 
    var nextState = Object.assign({}, state, changes); 

    this.componentWillUpdate(...); 
    this.state = nextState; 
    queueDomUpdateStuff(this.render(),() => this.componentDidUpdate()); 
    }); 
}; 
+0

Понял, спасибо. Я был на правильном пути. Также подумал, что это и есть причина. Знаете ли вы, где я могу прочитать некоторые рекомендации по использованию immutablejs с реакцией? –

+0

Это означает, что он объединит только значения/ключи объекта состояния, а не значения его дочерних элементов? Я имею в виду, что это не приведет к глубокому слиянию, в основном заменяя значение свойства user в моем примере –

2

Компоненты state должен быть простым объектом JavaScript; Значения этого объекта могут быть неизменяемыми значениями. Поддержка неизменяемых значений как состояние обсуждается в issue 3303.

+0

Итак, скоро это можно будет поддерживать. Благодарю. Знаете ли вы, где я могу прочитать некоторые рекомендации по использованию immutablejs с реакцией? –

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