ES6 (BabelJS を使用) でシンプルなコンポーネントを作成していますが、関数がthis.setState
動作しません。
典型的なエラーには次のようなものがあります
未定義のプロパティ 'setState' を読み取ることができません
または
this.setStateは関数ではありません
理由がわかりますか? コードは次のとおりです:
import React from 'react'
class SomeClass extends React.Component {
constructor(props) {
super(props)
this.state = {inputContent: 'startValue'}
}
sendContent(e) {
console.log('sending input content '+React.findDOMNode(React.refs.someref).value)
}
changeContent(e) {
this.setState({inputContent: e.target.value})
}
render() {
return (
<div>
<h4>The input form is here:</h4>
Title:
<input type="text" ref="someref" value={this.inputContent}
onChange={this.changeContent} />
<button onClick={this.sendContent}>Submit</button>
</div>
)
}
}
export default SomeClass
ベストアンサー1
this.changeContent
this.changeContent.bind(this)
は、プロパティとして渡される前にを介してコンポーネント インスタンスにバインドされる必要がありますonChange
。そうしないと、this
関数本体の変数はコンポーネント インスタンスではなく を参照することになりますwindow
。Function ::bind を参照してください。
ES6 クラスの代わりにを使用するとReact.createClass
、コンポーネントで定義されたすべての非ライフサイクル メソッドがコンポーネント インスタンスに自動的にバインドされます。自動バインドを参照してください。
関数をバインドすると新しい関数が作成されることに注意してください。レンダリングで直接バインドすると、コンポーネントがレンダリングされるたびに新しい関数が作成されます。または、コンストラクターでバインドすると、1 回だけ実行されます。
constructor() {
this.changeContent = this.changeContent.bind(this);
}
対
render() {
return <input onChange={this.changeContent.bind(this)} />;
}
Ref はコンポーネント インスタンスに設定されており、 には設定されていないため、 を変更React.refs
する必要があります。また、が参照できるように、 メソッドをコンポーネント インスタンスにバインドする必要があります。React.refs.someref
this.refs.someref
sendContent
this