2015-07-18 3 views
4

je le code suivant dans le composant:immutable.js & react.js setState prototype de l'efface objet

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(); 
    ... 
} 

Le problème est que lorsque je tente de mettre à jour la valeur onEdit Je vois que prevState possède un ensemble de prototypes différent. Je ne comprends pas pourquoi ou ce que je fais mal. Je vois cela dans la console

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

> Object.getPrototypeOf(prevState) 
Object {} 

Après l'état a été modifié, il va rendre où il bien sûr ne peut pas trouver obtenir la fonction ou quoi que ce soit de Immuable

réagir avec addons Utilisation 0.13.3.

+0

Est-ce parce qu'il devrait être un objet simple avec les touches et non de fantaisie Immuable? –

+0

Une raison spécifique que vous souhaitez utiliser 'immutable'? –

Répondre

6

Le mettre comme une clé sur l'état.

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

Actuellement, la raison pour laquelle vous ne pouvez pas utiliser un objet Immuable comme état est la même raison que vous ne pouvez pas faire this.state = 7: ce n'est pas un simple objet JavaScript.

En gros l'opération ressemble à ceci:

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

J'ai compris, merci. J'étais sur la bonne voie. Aussi pensé que c'est la raison. Savez-vous où je peux lire quelques bonnes pratiques sur l'utilisation d'immutablejs avec réagir? –

+0

Cela signifie qu'il ne fusionnera que les valeurs/clés de l'objet état et non les valeurs de ses enfants? Je veux dire qu'il ne fera pas la fusion profonde, en remplaçant fondamentalement la valeur de la propriété 'user' dans mon exemple –

2

Les composants state doivent être un objet JavaScript brut; valeurs de cet objet peuvent être des valeurs immuables. La prise en charge des valeurs immuables en tant qu'état est traitée dans issue 3303.

+0

Ok, donc cela pourrait être pris en charge bientôt. Merci. Savez-vous où je peux lire quelques bonnes pratiques sur l'utilisation d'immutablejs avec réagir? –