React学习之事件绑定的几种方法对比


Posted in Javascript onSeptember 24, 2017

前言

本文主要给大家介绍了关于React事件绑定的几种方法对比的相关呢荣,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

React事件绑定

由于类的方法默认不会绑定this,因此在调用的时候如果忘记绑定,this的值将会是undefined。

通常如果不是直接调用,应该为方法绑定this。绑定方式有以下几种:

1. 在构造函数中使用bind绑定this

class Button extends React.Component {
constructor(props) {
 super(props);
 this.handleClick = this.handleClick.bind(this);
 }
 handleClick(){
 console.log('this is:', this);
 }
 render() {
 return (
  <button onClick={this.handleClick}>
  Click me
  </button>
 );
 }
}

2. 在调用的时候使用bind绑定this

class Button extends React.Component {
 handleClick(){
 console.log('this is:', this);
 }
 render() {
 return (
  <button onClick={this.handleClick.bind(this)}>
  Click me
  </button>
 );
 }
}

3. 在调用的时候使用箭头函数绑定this

class Button extends React.Component {
 handleClick(){
 console.log('this is:', this);
 }
 render() {
 return (
  <button onClick={()=>this.handleClick()}>
  Click me
  </button>
 );
 }
}

4. 使用属性初始化器语法绑定this(实验性)

class Button extends React.Component {
 handleClick=()=>{
 console.log('this is:', this);
 }
 render() {
 return (
  <button onClick={this.handleClick}>
  Click me
  </button>
 );
 }
}

比较

方式2和方式3都是在调用的时候再绑定this。

  • 优点:写法比较简单,当组件中没有state的时候就不需要添加类构造函数来绑定this
  • 缺点:每一次调用的时候都会生成一个新的方法实例,因此对性能有影响,并且当这个函数作为属性值传入低阶组件的时候,这些组件可能会进行额外的重新渲染,因为每一次都是新的方法实例作为的新的属性传递。

方式1在类构造函数中绑定this,调用的时候不需要再绑定

  • 优点:只会生成一个方法实例,并且绑定一次之后如果多次用到这个方法也不需要再绑定。
  • 缺点:即使不用到state,也需要添加类构造函数来绑定this,代码量多一点。。。

方式4:利用属性初始化语法,将方法初始化为箭头函数,因此在创建函数的时候就绑定了this。

  • 优点:创建方法就绑定this,不需要在类构造函数中绑定,调用的时候不需要再作绑定。结合了方式1、方式2、方式3的优点
  • 缺点:目前仍然是实验性语法,需要用babel转译

总结

方式1是官方推荐的绑定方式,也是性能最好的方式。方式2和方式3会有性能影响并且当方法作为属性传递给子组件的时候会引起重渲问题。方式4目前属于实验性语法,但是是最好的绑定方式,需要结合bable转译

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
很多人都是用下面的js刷新站IP和PV
Sep 05 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
Jan 08 Javascript
jQuery的$.proxy()应用示例介绍
Apr 03 Javascript
编程语言JavaScript简介
Oct 16 Javascript
JavaScript判断浏览器类型的方法
Feb 10 Javascript
html5+javascript实现简单上传的注意细节
Apr 18 Javascript
浅谈FastClick 填坑及源码解析
Mar 02 Javascript
实例详解vue中的$root和$parent
Apr 29 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
May 09 Javascript
JQuery常用选择器功能与用法实例分析
Dec 23 jQuery
详解微信小程序之提高应用速度小技巧
Jan 07 Javascript
Angular+ionic实现折叠展开效果的示例代码
Jul 29 Javascript
一文让你彻底搞清楚javascript中的require、import与export
Sep 24 #Javascript
通过源码分析Vue的双向数据绑定详解
Sep 24 #Javascript
JS实现手写parseInt的方法示例
Sep 24 #Javascript
Js利用console计算代码运行时间的方法示例
Sep 24 #Javascript
详解Web使用webpack构建前端项目
Sep 23 #Javascript
vue webuploader 文件上传组件开发
Sep 23 #Javascript
jQuery使用zTree插件实现可拖拽的树示例
Sep 23 #jQuery
You might like
Sony CFR 320 修复改造
2020/03/14 无线电
学习php中的正则表达式
2014/08/17 PHP
php实现字符串翻转的方法
2015/03/27 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
PHP调用微博接口实现微博登录的方法示例
2018/09/22 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
ExtJs扩展之GroupPropertyGrid代码
2010/03/05 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
2010/05/25 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
python中使用while循环的实例
2019/08/05 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
Django models filter筛选条件详解
2020/03/16 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
2014升学宴答谢词
2014/01/26 职场文书
党员作风建设自查报告
2014/10/23 职场文书
2015年教研工作总结
2015/05/23 职场文书
2015迎新晚会活动总结
2015/07/16 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
python使用torch随机初始化参数
2022/03/22 Python
一文搞懂Redis中String数据类型
2022/04/03 Redis
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android