React 的事件处理与四种方法 (下)

挑战 React 第十六篇

上篇讲解找不到绑定的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>
第三种与第四种是我们组内常会使用的方式,因为放在 constructor 所以只会呼叫一次,不像第一二种可能在较複杂的情况会有效能的问题。

我还在学习的阶段,若有写错的讯息,都可以直接留言告知感谢!!!


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章