2017-08-08 2 views
1

Ich habe eine ziemlich grundlegende Funktion in meiner React-Komponente, die nicht wie erwartet funktioniert. Die Komponente selbst ist eine Navigationsleiste oben auf der Seite. Ich würde gerne ein Slide-Out-Menü für mobile Bildschirme implementieren, das durch einen Klick auf ein Hamburger-Symbol ausgelöst wird, das sich so im Navi befindet.React - this.setState funktioniert nicht wie erwartet, bis Funktion ein zweites Mal aufgerufen wird

<a href="javascript:void(0)" onClick={this.toggleMenu.bind(this)}><i className="fa fa-bars" /></a> 

Im Moment habe ich einfach diese Funktion einen visible Wert zwischen true zu umschalten einzurichten und false, die ich von meinem Hamburger nenne.

toggleMenu() { 
    console.log('Burger clicked... ', this.state.visible); 
    this.setState({ visible: !this.state.visible }); 
    console.log('Visible changed.. ', this.state.visible); 
    var value = "A message from the burger..."; 
    this.props.sendData(value, this.state.visible); 
    } 

Das Problem ist this.setState({ visible: !this.state.visible }); von seinem Anfangswert von false schaltet nicht, bis das Hamburgere Symbol ein zweites Mal angeklickt wird.

Nur als Referenz hier ist der Konstruktor der Komponente.

Ich bin relativ neu zu reagieren, so immer noch finden mich aus. Wenn mir jemand sagen könnte, wie ich dieses Problem lösen könnte, wäre ich sehr dankbar. Danke im Voraus!

Antwort

2

Reagieren ChargensetState Anrufe Leistung zu erhöhen, so durch direkt Ihren neuen Zustand der Berechnung des alten Zustand zugreifen, wie Sie möglicherweise nicht wie erwartet tun, aktualisieren Sie Ihren toggleMenu wie diese

toggleMenu() { 
    console.log('Burger clicked... ', this.state.visible); 
    this.setState(prevState => { 
     console.log('Visible changed.. ', !prevState.visible); 
     var value = "A message from the burger..."; 
     this.props.sendData(value, !prevState.visible); 
     return {visible: !prevState.visible }; 
    }); 
} 
+0

Vielen Dank für die Antwort. Während dies funktioniert, scheint es ein wenig verworren. Verwendet 'prevState' die Standardmethode für die Bedienung von Toggle/Switch in React? Ich frage, weil ich die Antwort von Bart unten versuchte, wo ein Rückruf stattdessen verwendet wird. Es funktioniert auch, aber erlaubt mir 'this.setState.visible' mit praktisch keinen anderen Änderungen außer dem Hinzufügen des Callbacks. Gibt es einen besonderen Fall, warum dies ein schlechtes Muster ist? Danke nochmal für die Eingabe! – mikeym

+0

** Wenn ** Sie Ihren neuen Zustand berechnen, indem Sie direkt auf den alten Zustand zugreifen, wie Sie es tun, dann übergeben Sie einen Rückruf an die 'setState' -Funktion, wie ich tat, weil React mehrere' setState' Aufrufe Batch (Enqueues), um die erhöhen Leistung, also nachdem 'setState' zurückkehrt, wird Ihr Status möglicherweise noch nicht ** aktualisiert **. Hier ist der Link zum Weiterlesen https://facebook.github.io/react/docs/state-and-lifecycle.html#do-not-modify-state-directly – Dummy

+0

Ok. Danke für die Information und den Link. Es fängt jetzt an, ein bisschen mehr Sinn jetzt zu machen. – mikeym

0

Denken Sie daran, dass this.setState() asynchron ist. Wenn Sie möchten, dass nach dem Festlegen des neuen Status etwas passiert, müssen Sie es als Callback-Funktion einfügen:

Verwandte Themen