React事件绑定的几种方式

image

一、React事件是什么

react应用中,事件名都是用小驼峰格式进行书写,例如onclick要改写成onClick

最简单的事件绑定如下:

1class ShowAlert extends React.Component { 2  showAlert() { 3    console.log("Hello World"); 4  } 5 6  render() { 7    return <button onClick={this.showAlert}>show</button>; 8  } 9}

从上面可以看到,事件绑定的方法需要使用{}包住

上述的代码看似没有问题,但是当将处理函数输出代码换成console.log(this)的时候,点击按钮,则会发现控制台输出undefined

二、如何绑定事件

为了解决上面正确输出this的问题,常见的绑定方式有如下:

  • render方法中使用bind

  • render方法中使用箭头函数

  • constructor中bind

  • 定义阶段使用箭头函数绑定

render方法中使用bind

如果使用一个类组件,在其中给某个组件/元素一个onClick属性,它现在并会自定绑定其this到当前组件,解决这个问题的方法是在事件函数后使用.bind(this)this绑定到当前组件中

1class App extends React.Component { 2  handleClick() { 3    console.log('this > ', this); 4  } 5  render() { 6    return ( 7      <div onClick={this.handleClick.bind(this)}>test</div> 8    ) 9  } 10}

这种方式在组件每次render渲染的时候,都会重新进行bind的操作,影响性能

render方法中使用箭头函数

通过ES6的上下文来将this的指向绑定给当前组件,同样在每一次render的时候都会生成新的方法,影响性能

1class App extends React.Component { 2  handleClick() { 3    console.log('this > ', this); 4  } 5  render() { 6    return ( 7      <div onClick={e => this.handleClick(e)}>test</div> 8    ) 9  } 10}

constructor中bind

constructor中预先bind当前组件,可以避免在render操作中重复绑定

1class App extends React.Component { 2  constructor(props) { 3    super(props); 4    this.handleClick = this.handleClick.bind(this); 5  } 6  handleClick() { 7    console.log('this > ', this); 8  } 9  render() { 10    return ( 11      <div onClick={this.handleClick}>test</div> 12    ) 13  } 14}

定义阶段使用箭头函数绑定

跟上述方式三一样,能够避免在render操作中重复绑定,实现也非常的简单,如下:

1class App extends React.Component { 2  constructor(props) { 3    super(props); 4  } 5  handleClick = () => { 6    console.log('this > ', this); 7  } 8  render() { 9    return ( 10      <div onClick={this.handleClick}>test</div> 11    ) 12  } 13}

三、区别

上述四种方法的方式,区别主要如下:

  • 编写方面:方式一方式二写法简单,方式三的编写过于冗杂

  • 性能方面:方式一方式二在每次组件render的时候都会生成新的方法实例,性能问题欠缺。若该函数作为属性值传给子组件的时候,都会导致额外的渲染。而方式三方式四只会生成一个方法实例

综合上述,方式四是最优的事件绑定方式 👍

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )