【React】componentでのonClickの使い方
ReactでonClickにメソッドをひもづけたときにundefinedエラーが出た。そのときに対応する方法がいくつかまとめておく。
問題のコード
class App extends React.Component {
constructor() {
super()
this.state = { items: [] }
}
addItem() {
this.setState({
items: [...this.state.items, this.refs.name.value]
})
}
render() {
return (
<div>
<input ref="name" />
<button onClick={this.addItem}>追加</button>
<ul>{this.state.items.map((item, i) => {
return <li key={i}>{item}</li>
})}</ul>
</div>
)
}
}こちらのコードを実行すると、以下のエラーが出てJavascriptでお決まり(?)のthisの問題。この場合だと、thisはbuttonになるのでsetStateなんてないよと怒られる。
Uncaught TypeError: Cannot read property 'setState' of undefined
方法1
render() {
return (
・・・
<button onClick={e => this.addItem(e)}>追加</button>
)
}方法2
constructor() {
・・・
this.addItem = this.addItem.bind(this)
}
または
render() {
return (
・・・
<button onClick={this.addItem.bind(this)}>追加</button>
)
}方法3
class App extends Component {
・・・
addItem = () => {
this.setState({
items: [...this.state.items, this.refs.name.value]
})
}
}方法3は今時点ではBabel限定の書き方みたいだけど。人によって書き方違うから理解しておいた方がよさそう。個人的には方法3が1番わかりやすい。以上です。