上篇講解找不到綁定的this,因此 setState 才會 undefined,此篇會講解如何解決上述狀況的四種方式。
按了按鈕,訊息改變
在render method裡 event 事件方法綁定 this
handleClickMessage() {
    console.log(this);
    this.setState({
      message: '訊息已改變'
    })
  }
render() {
    return (
      <div>
        <div>{this.state.message}</div>
        <button onClick={this.handleClickMessage.bind(this)}>click</button>
      </div>
    )
  }
this,因此可以呼叫 this.setState

與第一種方式一樣,只是改用 arrow function,因此可以看到 handleClickMessage 有 + 小括弧
 render() {
    return (
      <div>
        <div>{this.state.message}</div>
        <button onClick={() => this.handleClickMessage()}>click</button>
      </div>
    )
  }
與第一種方式雷同,但綁定的方法改放在 constructor,最後結論會在說明差別在哪裡。
import React, { Component } from 'react'
class EventBind extends Component {
  constructor(props) {
    super(props)
  
    this.state = {
       message: '初始訊息'
    }
    // 在 constructor 綁定事件方法
    this.handleClickMessage = this.handleClickMessage.bind(this);
  }
  
  handleClickMessage() {
    console.log(this);
    this.setState({
      message: '訊息已改變'
    })
  }
  render() {
    return (
      <div>
        <div>{this.state.message}</div>
        <button onClick={this.handleClickMessage}>click</button>
      </div>
    )
  }
}
export default EventBind
事件處理的方法直接使用 arrow function
import React, { Component } from 'react'
class EventBind extends Component {
  constructor(props) {
    super(props)
  
    this.state = {
       message: '初始訊息'
    }
  }
  
  // 方法直接使用 arrow function
  handleClickMessage = () => {
    console.log(this);
    this.setState({
      message: '訊息已改變'
    })
  }
  render() {
    return (
      <div>
        <div>{this.state.message}</div>
        <button onClick={this.handleClickMessage}>click</button>
      </div>
    )
  }
}
export default EventBind
render 裡面,若有需要 rerender 重新渲染 的情況,可能會有效能上的問題。將參數傳給 Event Handler。以下舉例為傳送參數 id:<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>
我還在學習的階段,若有寫錯的訊息,都可以直接留言告知感謝!!!