React 報錯"Cannot read property 'setState' of undefined"
App.js
import React, { Component } from 'react';
import './App.css';class App extends Component {
constructor(props){
super(props);
this.state = {
num: 90
}
};
handleClick(){
this.setState({
num: this.state.num + 1
})
};
render() {
return (
<div className="App">
{this.state.num}
<button onClick={this.handleClick}>點選</button>
</div>
);
}
}export default App;
我們把num初始值通過建構函式constructor儲存在this.state裡,之後我們給button按鈕一個點選事件handleClick,
然後通過點選button按鈕來更新num的初始值,當我們點選的時候,毫無疑問報錯了“Cannot read property 'setState' of undefined”,
翻譯意思是:‘無法讀取未定義的屬性'setState'’,他的意思就是告訴我們,當我們點選的時候,並沒有讀取到setState中的值,也就是說:
handleClick方法中的this與元件中的this不一致,不是同一個this。
碰到這個問題有兩種解決方法:這兩種方法的目的就是要保證:handleClick方法中的this與元件中的this要保持一致,這樣才能讀取到setState中的值來改變num,
第一種方法:
import React, { Component } from 'react';
import './App.css';class App extends Component {
constructor(props){
super(props);
this.state = {
num: 90
}this.handleClick = this.handleClick.bind(this); //把元件中的this繫結到handleClick方法中,這樣就會保持this一致
};
handleClick(){
this.setState({
num: this.state.num + 1
})
};
render() {
return (
<div className="App">
{this.state.num}
<button onClick={this.handleClick}>點選</button><button onClick={this.handleClick.bind(this)}>點選</button> //把上面的寫到這裡也是可以的
</div>
);
}
}export default App;
第二中方法:
import React, { Component } from 'react';
import './App.css';class App extends Component {
constructor(props){
super(props);
this.state = {
num: 90
}
};handleClick(){
this.setState({
num: this.state.num + 1
})
};
handleClick = () => { //利用箭頭函式
this.setState({
num: this.state.num + 1
})
};
render() {
return (
<div className="App">
{this.state.num}
<button onClick={this.handleClick}>點選</button><button onClick={()=> {this.handleClick()}>點選</button>或 <button onClick={() => this.handleClick()}>點選</button>
</div>
);
}
}export default App;
在 React 裡面,要將類的原型方法通過 props 傳給子元件,傳統寫法需要 bind(this),否則方法執行時 this 會找不到:
<button onClick={this.handleClick.bind(this)}></button>
或者<button onClick={() => this.handleClick()}></button>