2016-06-04 7 views
1

Ich versuche, eine einfache React-Komponente zu schreiben, die die Anzahl der in ein Textfeld eingegebenen Zeichen zählt. Die Komponente wird zwar gerendert, aber wenn ich versuche, auf this.state zu verweisen, bricht die Komponente ab und der Bildschirm ist leer.Meine React-Komponente bricht ab, wenn ich this.state verwende

Hier ist der Code:

HTML:

<div id="content"> 

</div> 

CSS:

#content { 
    width: 800px; 
    margin-left: auto; 
    margin-right: auto; 
} 

body { 
    background-color: #F1FAEE; ; 
} 

h1 { 
    font-family: Avenir; 
    color: black; 
    font-size: 44px; 
} 

JavaScript:

class Box extends React.Component { 

    getInitialState() { 
    return { 
     text: this.props.text 
    } 
    } 

    handleChange(event) { 
    this.setState({ 
     text: event.target.value 
    }) 
    } 

    render() { 
    return (
     <div> 
     <h1>This App Counts Letters</h1> 
     <textarea value = {this.props.text} onChange = {this.handleChange}> </textarea> 
     <h1>{this.state.text.length}</h1> 
     </div> 
    ); 
    } 
}; 

ReactDOM.render(<Box text = "I find this frustrating"/>,document.getElementById("content")) 

Das Problem ist mit {this.state.text. Länge} Dinge machen, wenn diese Zeile {this.props.text.length} geändert wird

+0

Haben Sie versucht zu debuggen? anscheinend ist 'this.state.text' entweder nicht definiert oder hat keine 'length'-Eigenschaft. Auch ist unklar, was "Pausen" bedeutet. Wenn Sie die Browserkonsole öffnen, können Sie den Fehler normalerweise sehen, so dass Sie vermeiden können, diese Art von Fragen zu posten. – akonsu

Antwort

0

Es gibt ein paar Noten waren so zu machen, ich werde einfach neu zu schreiben und kommentieren, wie ich gehen.

Ich habe es nicht getestet, aber das sollte funktionieren.

class Box extends React.Component { 

    // getInitialState() {} should be replaced in ES6 with: 
    constructor(props) { 
    super(props); 
    this.state = { 
     text: props.text 
    } 
    } 

    // This looks good. 
    handleChange(event) { 
    this.setState({ 
     text: event.target.value 
    }) 
    } 

Der Wert eines TextArea- Element zwischen <textarea> und </textarea>. Nicht als 'Wert'-Attribut gespeichert, so wie Sie es ursprünglich hatten.

Als nächstes sollte dieser Wert STATE nicht PROPS sein, da es aktualisiert werden muss.

Schließlich haben Sie wahrscheinlich Probleme, weil in HandleChange this nicht korrekt gebunden ist. Ich habe es durch '() => this.handleChange()' ersetzt, weil der Fettpfeil in ES6 (=>) das für dich repariert.

render() { 
    return (
     <div> 
     <h1>This App Counts Letters</h1> 
     <textarea onChange = {() => this.handleChange()}>{this.state.text}</textarea> 
     <h1>{this.state.text.length}</h1> 
     </div> 
    ); 
    } 
}; 

ReactDOM.render(<Box text = "I find this frustrating"/>,document.getElementById("content")) 
+0

Das war sehr hilfreich! Danke, dass Sie großzügig sind. – WriterState

+0

Die Pfeilfunktion schien das Problem nicht zu lösen. Ich fand jedoch eine andere Lösung, die von jemandem bereitgestellt wurde, und diese Lösung bestand darin, this.handleChange = this.handlChange.bind (this) in der Konstruktorfunktion zu verwenden. Ich brauchte eine Weile, um zu verstehen, was die Binde-Methode bewerkstelligte, aber jetzt scheint es klar zu sein ... atm haha – WriterState

Verwandte Themen