2016-07-08 7 views
2

Ich versuche, meinen normalen React-Status durch Immutable zu aktualisieren, und bin in einige wenige Probleme geraten. Der Status ist nicht tief geschachtelt oder ist nicht verschachtelt von etwas anderem als dem Zustand selbst, wie { "username" : "keyval" : null}}Aktualisiere Reagestatus mit Unveränderlich

Das bedeutet, ich konnte etwas wie username.update('keyval', something) nicht tun, stattdessen brauche ich einen anderen Ansatz. Es ist eine ziemlich einfache Frage, ich weiß einfach nicht, wie ich es machen soll. So sieht mein setState aus, mit dem ich eine Immutable-setState-Aktion erstellen möchte.

handleUpdatePassword(event) { 
    event.persist() 
    this.setState(({password}) => ({ 
     password: state.update('password', event.target.value) 
     }) 
    ); 
    } 

Und hier ist der Fehler, den ich beim Versuch:

handleUpdatePassword(event) { 
     event.persist() 
     this.setState({ 
      password: state.update('password', event.target.value) 
      }) 
     } 

sad Auch Dies funktioniert, aber ich bekomme diese Fehlermeldung: this.state.updater is not a function

handleUpdateUsername(event) { 
    console.log(this.state) 
    event.persist() 
    this.setState({ 
     username: this.state.update('username', event.target.value) 
     }) 
    } 
+0

FWIW zu aktualisieren, sah Ive in diese auch, [link] (https://github.com/facebook/immutable-js/wiki/Immutable-as-React-state) aber es ist irreführend, da der größte Teil des Staates nicht für grundlegende Komponenten konzipiert ist. –

+0

Ich denke 'this.state' sollte' Immutable.Map' sein –

+0

Es ist, vorher erklärt. War irgendwie offensichtlich: p –

Antwort

6

state sollte ein einfaches JavaScript-Objekt sein, wie Sie in der documentation lesen können.

Note that state must be a plain JS object, and not an Immutable collection, because React's setState API expects an object literal and will merge it (Object.assign) with the previous state.

Ihr Ausgangszustand so etwas wie dieses

constructor(){ 
    ... 
    this.state = {data: Map({ password: "", username: ""})} 
} 

Danach aussehen sollte, Sie in der Lage sein werden, die Daten wie diese

handleUpdatePassword(event) { 
this.setState(({data}) => ({ 
     data: data.update('password', password => event.target.value) 
    })); 
} 
+0

ja, richtig. Ich möchte vermeiden, eine verschachtelte Obj, wo ich brauche es nicht zu sein, so will ich Zustand zu einem unveränderlichen –

+0

werde ich markiere das als gelöst, vielleicht könnte @ lee-byron helfen, den ganzen Staat unveränderlich zu machen? :) –

+0

Hier ist ein kurzer Codepen, der das illustriert: [React + ImmutableJS State: Wechsel zu Chuck Norris] (https://codepen.io/codekiln/pen/ZXoXaa? Editoren = 0011) –

0

Sie erstellen explizite Objekte . Lassen Sie ImmutableJS es für Sie tun.

class YourReactComp extends React.Component { 
    constructor() { 
    this.state = Immutable.Map({"username": ""}); 
    } 
    handleUpdateUsername(event) { 
    console.log(this.state) 
    event.persist() 
    this.setState(this.state.set("username", event.target.value)); 
    } 
} 

EDIT

ImmutableMap.update(key, updater) verwendet einen Rückruf um den Wert einzustellen, Sie ImmutableMap.set(key, newValue) hier wollen.

+0

das sieht aus wie mein Code von vor –

+0

Dann schauen Sie genau hin. Ihr erster Code gibt ein Lambda für setstate (macht keinen Sinn), die zweite gibt ein reguläres JS-Objekt und im Inneren ruft man update mit den falschen Parametern auf. Ihr drittes Beispiel ist genau das gleiche wie das zweite. –

+0

Sorry, nicht genau. In der zweiten verwenden Sie nicht den in der Komponente gespeicherten Zustand, sondern einen aus dem Bereich, den wir wirklich nicht herausfinden können, ob er deklariert ist oder nicht, weil wir nicht Ihren ganzen Code sehen. –

Verwandte Themen