2017-06-16 2 views
4

Ich habe diesen Code:Status nicht direkt mutieren. Verwenden Sie setState() reagieren/nein-direct-Mutation-Zustand

constructor(props) { 
    super(props) 
    this.state = { 
     loginButton: '', 
     benchmarkList: '' 
    } 
    if (props.username == null) { 
     this.state.loginButton = <GoogleButton></GoogleButton> 
    } else { 

    } 
} 

Es gibt mir eine ESLint Warnung:

Nicht Zustand direkt mutieren. Verwenden Sie setState() react/no-direct-mutation-state.

Nun, was soll ich tun, was ich nicht setState innerhalb constructor direkt verwenden kann, wie es error erstellt und wie diese Aktualisierung gibt mir Fehler.

+0

Einstellung 'this.state' nicht die erste Anweisung sein muss; Sie können zuerst alle Arten von 'var's setzen und dann die' 'this.state'' verwenden. –

+3

Ich werfe hier einfach hin, dass das Speichern einer React-Komponente im Zustand wahrscheinlich nicht die beste Richtung ist. – rossipedia

+1

In der Tat ist eine bessere Lösung, '{! This.state.username && }' in Ihrem Renderobjekt zu verwenden . –

Antwort

3

Zunächst einmal wir sollten die UI-Komponenten innerhalb Zustand nicht speichern Variable sollte Zustand nur Daten enthalten. Alle UI-Teil sollte innerhalb render Methode sein.

Wenn Sie eine Komponente auf der Grundlage von Daten render möchten dann verwenden Sie conditional rendering. Überprüfen Sie den Wert this.state.loginButton, und wenn es null ist, dann rendern Sie diese Schaltfläche.

So:

constructor(props) { 
    super(props) 
    this.state = { 
     loginButton: props.username, 
     benchmarkList: '' 
    } 
} 

render(){ 
    return(
     <div> 
      {!this.state.loginButton ? <GoogleButton></GoogleButton> : null} 
     </div> 
    ) 
} 

Im Idealfall sollten wir nicht mehr nur den props Wert in state auch, so direkt this.props.username verwenden, ich habe das, weil nicht weiß, über den vollständigen Code.

+0

Ok. Ich sehe Ihren Punkt der Verwendung von bedingten in Ansichten. Aber warum um alles in der Welt werde ich eine Property-Eigenschaft in Staatseigentum speichern, wenn diese Property nur von Parent kontrolliert wird? –

+0

@JennaWesley Mann, ich zeigte nur den besseren Weg, weiß nicht über Ihren vollständigen Code. Sie sollten diese "Requisiten" auch nicht in 'state' speichern, sondern direkt über' this.props.username'. –

+0

Ich dachte, Sie könnten diesen Wert irgendwo in dieser Komponente aktualisieren, deshalb. –

5
constructor(props) { 
    super(props) 
    this.state = { 
     loginButton: props.username == null? <GoogleButton></GoogleButton>: '', 
     benchmarkList: '' 
    } 
    } 

Oder Sie können setState verwenden in componentWillMount()

componentWillMount(){ 
    let loginButton = props.username == null? <GoogleButton></GoogleButton>: ''; 
    this.setState({loginButton: loginButton}); 
} 
+0

Der erste Weg wird den Code unordentlich machen, aber ja, ich kann etwas ähnliches machen. Bereite zuerst die Variablen vor und dann 'this.state = ...' –

+0

Die Frage bezieht sich auf 'Konstruktor', aber' componentWillMount' ist ein guter Platz. – oklas

0

Wie Status innerhalb constructor in ReactJS zu aktualisieren?

Erstellen Sie die Daten-Struktur, ändern Sie es als notwendig, und in dem Zustand am Ende zuweisen, wenn alles getan ist:

constructor(props) { 
    super(props) 
    let state = { 
     loginButton: '', 
     benchmarkList: '' 
    } 
    if (props.username == null) { 
     state.loginButton = true 
    } else { 
     state.loginButton = false 
    } 
    this.state = state 
} 
Verwandte Themen