2017-11-29 1 views
0

Ich bin ein Anfänger in der Reaktionsumgebung, daher mag meine Frage für viele von Ihnen grundlegend erscheinen. Aber glauben Sie mir, ich habe mich in diesem Teil festgefahren. Ich versuche, den Textfeld-Wert beim Klicken auf die Schaltfläche zu erhalten und den Wert an eine andere Funktion als Prop zu senden. Ich bin in der Lage, den Wert von Textfeld Feld zu extrahieren, aber auf dem Click-Ereignis, bekomme ich einen Fehler 'Property' Property von 'undefined' kann nicht gelesen werden.React.js onclick event: Ich kann die Eigenschaft 'requisiten' von undefined nicht lesen

hier sind die wichtigen Punkte: -

  1. termchange() wird zum Extrahieren des Eingabetextwert verwendet.
  2. handleclick wird zum Extrahieren von Textbox-Wert onclick-Ereignis verwendet.
  3. oncitychange ist eine Funktion, an die ich den Wert der Textbox senden muss (oncitychange() - Funktion ist in einer anderen Komponente).

Vielen Dank im Voraus.

hier ist mein Code: -

import React,{ Component } from 'react'; 
import ReactDom from 'react-dom'; 
class SearchBar extends Component { 
    constructor(props){ 
    super(props); 
    this.state = { 
     cityname:'' 
    } 
    } 

    render(){ 
    return(
     <div> 
     <span>Enter the city: </span> 
     <input type="text" id="txtbox" value={this.state.cityname} 
      onChange={event=>this.termchange(event.target.value)} /> 
     <input type="submit" onClick={this.handleclick} /> 
     </div> 
    ); 
    } 

    termchange(cityname){ 
    this.setState({cityname}); 
    } 

    handleclick(){ 
    this.props.oncitychange(cityname); 
    } 
} 

export default SearchBar; 
+0

während technisch nicht zwingend Objekt auf die Reaktion fest, in der Regel die Render-Methode definiert die letzte Methode sein sollte, nur ein Stil Tipp –

+3

oh auch versuchen, Ihre Methoden in Ihrem Konstruktor zu binden, fügen Sie einfach eine neue Zeile zum Konstruktor und sagen 'this.handleclick = this.handleclick.bind (this)' das sollte Ihr Problem hoffentlich lösen, das Problem ist, dass dies 'zeigt nicht auf Ihre Komponente, sondern auf Ihre Methode, also müssen Sie' this 'so binden, dass es auf Ihren com verweist stattdessen. Sie müssen in Ihrem Klick-Handler auf den Status verweisen und 'cityname' sollte' this.state.cityname' sein und wenn Sie den Status setzen, sollte es 'this.setState {cityname: cityname}' sein. –

Antwort

1

Es geht um Umfang. Ihre Funktionen wissen nicht, was this ist. Sie können this im Konstruktor binden oder andere Optionen sind je nach Umgebung einfacher.

zu Ihrem Konstruktor hinzufügen, dies zu beheben:

this.termchange = this.termchange.bind(this); this.handleclick = this.handleclick.bind(this);

Oder lesen https://blog.andrewray.me/react-es6-autobinding-and-createclass/ für eine ausführlichere Erklärung, was los ist.

Ich persönlich benutze ES7 fette Pfeil Klassenmethoden für die Einfachheit und ich denke, die meisten Entwickler bewegen sich in diese Richtung.

+1

Warten Sie mit' ES7 fetten Pfeil verwenden 'Meinst Du wie 'handleClick =() => {}'? Ich wusste nicht, dass das funktionieren würde, das ist schön –

+0

Ja, nein zurückblicken, nachdem Sie es entdecken –

+0

Danke, das half mir, mein Problem zu beheben. Nach dem Einfügen Ihres Teils in meinen Code habe ich 'this.props.oncitychange (this.state.cityname);' unter handleClick() -Funktion und ihre Arbeit. –

2

hinzufügen this.handleClick = this.handleClick.bind(this) bei Konstruktor

+0

Das wird funktionieren, ich nicht Ich weiß, warum jemand es abgelehnt hat. Ich habe es für dich auf 0 zurück gesetzt. Zusätzliche Erklärung wäre hilfreich, obwohl es in den Kommentaren zu Frage –

+0

erklärt wurde Vielen Dank für Ihre Antwort, aber es funktioniert nicht. 'Uncaught ReferenceError: Cityname ist nicht definiert' Dies ist der Fehler, auf den das onClick-Ereignis stößt. –

+0

Schätzen Sie es [Cory Danielson] (https://stackoverflow.com/users/749622/cory-danielsonll) – SALEH

0

Ersetzen Sie einfach onClick={this.handleClick} von:

onClick={this.handleClick.bind(this)} 

Auf diese Weise der Funktionsumfang wird

+0

Ich denke nicht, dass das richtig ist, wenn Sie an diesem Punkt binden, wird 'this 'auf das Eingabeelement zeigen, nicht wahr? Sie sollten im Konstruktor binden –

+2

Es wird funktionieren, aber ich glaube, es ist ineffizient, wie es bei jedem Rendern passiert. –

+0

@TravisWhite yeah du hast wahrscheinlich recht, die Bindung am Konstruktor könnte besser sein – pablopunk

Verwandte Themen