2017-10-21 85 views
0

在這裏這個例子中,我們需要handleClick()的「這個」對象綁定到全局範圍:爲什麼我們需要綁定「這」的JSX回調

class Toggle extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = {isToggleOn: true}; 

    // This binding is necessary to make `this` work in the callback 
    this.handleClick = this.handleClick.bind(this); 
    } 

    handleClick() { 
    this.setState(prevState => ({ 
     isToggleOn: !prevState.isToggleOn 
    })); 
    } 

    render() { 
    return (
     <button onClick={this.handleClick}> 
     {this.state.isToggleOn ? 'ON' : 'OFF'} 
     </button> 
    ); 
    } 
} 

然而,handleClick()是在組件的範圍內定義的,所以我們不應該不需要爲這個函數指定'this'對象,因爲它已經可以引用組件本身了?

+0

因爲什麼'this'是在事件處理程序(通常調度該事件的對象 - 在你的代碼,它會是'button'元素) –

+0

同樣,你的代碼會導致'isToggleOn'最初爲'true',然後是''ON''或'OFF'' - 因此,總是「truthy」 - 看起來很奇怪 –

回答

2

你是對的,但你錯過了一件事。沒有綁定到處理程序的組件this的範圍。那麼當你想要事件的上下文時會發生什麼?你沒有它。

解決此問題的另一種方法是從詞彙上綁定組件,以便您不必擔心手動綁定每個函數。

handleClick =() => { //arrow function applied 
    this.setState(prevState => ({ 
     isToggleOn: !prevState.isToggleOn 
    })); 
} 

請注意,現在您現在不再需要組件構造函數了。

constructor(props) { 
    super(props); 
    this.state = {isToggleOn: true}; 

    // This binding is necessary to make `this` work in the callback 
    this.handleClick = this.handleClick.bind(this); 
} 

現在變得

state = {isToggleOn: true}; 
相關問題