2016-09-27 4 views
4

Ich habe genau das gemacht, was von der am meisten angenommenen Antwort auf diesen Beitrag show or hide element in react.js gezeigt wurde, um meine Elemente anzuzeigen und zu verbergen.ReactJS: Element anzeigen oder ausblenden funktioniert nur beim ersten Klick auf die Schaltfläche

Aber es funktioniert nur auf den ersten Knopf klicken. Wenn ich einen anderen Wert in mein Formular einfüge und ihn erneut übergebe, bleiben die Daten unverändert. Es geht nie wieder in "Ergebnisse". Was mache ich falsch?

Dies ist der Code aus diesem Link oben:

var Search = React.createClass({ 
    getInitialState: function() { 
     return { showResults: false }; 
    }, 
    onClick: function() { 
     this.setState({ showResults: true }); 
    }, 
    render: function() { 
     return (
      <div> 
       <input type="submit" value="Search" onClick={this.onClick} /> 
       { this.state.showResults ? <Results /> : null } 
      </div> 
     ); 
    } 
}); 

var Results = React.createClass({ 
    render: function() { 
     return (
      <div id="results" className="search-results"> 
       Some Results 
      </div> 
     ); 
    } 
}); 

ReactDOM.render(<Search />, document.getElementById('container')); 

EDIT neuen Code:

module.exports = React.createClass({ 
    getInitialState: function() { 
     console.log("in getInitialState"); 
     return { showResults: false }; 
    }, 
    onClick: function(e) { 
     e.preventDefault(); 
     data = null; 
     console.log("in onClick"); 
     ticId = ReactDOM.findDOMNode(this.refs.ticketid).value; 
     if (this.state.showResults == true) // second button click (update data) 
     { 
      var newdata = ""; 
      $.ajax({ 
      url: 'http://localhost:x/' + 'tickets', 
      type: 'GET', 
      dataType: 'json', 
      async: false, 
      headers: { 
       "Authorization": "Basic " + btoa(u + ":" + p) 
      },  
      data: {ticketid: ticId}, 
      success: function(result) { 
       newdata = result.results; 
       } 
      }); 

      if(newdata) 
      { 
       console.log(newdata); //SUCCESS: getting new data here 
      } 

      this.state.data = newdata; //FAIL: state not getting refreshed 
     } 

     else 
     { 
      this.setState({ showResults: true }); 
     } 
    }, 
    render: function() { 
     return (
      <div className='someclass'> 
       <form className="someForm" onSubmit={this.onClick}> 
        <input type="text" placeholder = "Enter ticket Id" ref="ticketid" /> 
        <input type="submit" value="Find!!" /> 
        { this.state.showResults ? <Results /> : null } 
       </form> 

      </div> 
     ); 
    } 
}); 
+0

Können Sie klären diese 'Wenn ich Eingabe eines anderen Wertes in meiner Form und schicken Sie dann die Daten die gleichen wie before.' bleiben? –

+0

Also habe ich ein Formular in meinem HTML, das Benutzereingaben nimmt und basierend darauf mache ich einen Ajax-Aufruf, um Daten in meine Ergebnisse zu bekommen. Aber was passiert, wenn der Benutzer zum ersten Mal einen Wert eingibt, alles funktioniert gut. Wenn der Benutzer jedoch einen anderen Wert in die Suchbox eingibt, wird das Ergebnis nicht aktualisiert, sondern bleibt unverändert. – 90abyss

+0

@ 90abyss ist eine Komponente mit statischem Text richtig? Was erwarten Sie von der zweiten Eingabe? –

Antwort

0

Sie müssen wechseln als

onClick: function() { 
     this.setState({ showResults: !this.state.showResults }); 
    }, 
+0

Danke Fazal. Ich habe das getan und es funktioniert nur, wenn ich zweimal auf den Senden-Button klicke. Im ersten Klick löscht es das angezeigte Ergebnis und im zweiten Klick rendert es das Ergebnis. Alles andere, was ich in der OnClick-Funktion hinzufügen muss, um das zu beheben? – 90abyss

+0

schalten Sie nur 'showResults' um, wenn keine' Tickets' verfügbar sind. Platziere eine if-Anweisung –

+0

Kannst du mir bitte meinen obigen Schnitt ansehen? Nicht sicher was genau zu tun ist, wenn this.state.showResults == true .. wenn ich es falsch mache, dann wird bcoz dieser Bedingung in render() null angezeigt. Wenn ich nichts tue, wird Results nicht aktualisiert. Wie kann ich sicherstellen, dass die Ergebnisse aktualisiert werden? – 90abyss

0

Besser diese verwenden:

onClick: function() { 
    this.setState(function (prevState) { 
    return { 
     showResults: !prevState.showResults 
    }; 
    }); 
} 

Source

+0

Hey Nevin. Danke für deine Antwort. Das aktuelle Problem besteht darin, dass die Ergebnisse nicht aktualisiert werden. Ich kann umschalten, aber das Ergebnis wird nicht aktualisiert, wenn this.state.showResults bereits gleich true ist. Bitte sehen Sie meine Bearbeitung oben. – 90abyss

+0

@ 90abyss habe ich gelesen. Allerdings ist eine Komponente mit statischem Text richtig? Was erwarten Sie von der zweiten Eingabe? Sie erwähnten - "Das aktuelle Problem ist, dass die Ergebnisse nicht aktualisiert werden." -> Ergebnisse ist eine statische Komponente mit statischem Text, was willst du darin aktualisieren? –

+0

Es gibt ein HTML-Formular, das die Benutzereingabe "ticketid" verwendet. Diese Ticket-ID wird von der Komponente verwendet, um einen Ajax-Aufruf an den Server zu senden. Es gibt die formatierten Ergebnisse zurück. Das Problem ist also, wenn der Benutzer zuerst kommt und "123" eintippt, dann funktioniert alles gut. Aber wenn er erneut nach einem anderen Ticket "576" sucht, wird Komponente nicht aufgerufen. Ich bin nicht sicher, wie man den Zustand der Daten aktualisiert – 90abyss

Verwandte Themen