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 相关文章推荐
JavaScript获得选中文本内容的方法
Dec 02 Javascript
JavaScript关于select的相关操作说明
Jan 13 Javascript
基于jQuery实现模拟页面加载进度条
Apr 01 Javascript
js控制鼠标事件移动及移出效果显示
Oct 19 Javascript
浅谈JSON.parse()和JSON.stringify()
Jul 14 Javascript
JavaScript笔记之数据属性和存储器属性
Mar 31 Javascript
jQuery层级选择器实例代码
Feb 06 Javascript
使用JavaScriptCore实现OC和JS交互详解
Mar 28 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
Aug 24 Javascript
微信小程序实现表单校验功能
Mar 30 Javascript
基于vue2实现上拉加载功能
Nov 28 Javascript
使用webpack编译es6代码的方法步骤
Apr 28 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
PHP系统流量分析的程序
2006/10/09 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
试用php中oci8扩展
2015/06/18 PHP
深入了解javascript中的prototype与继承
2013/04/14 Javascript
js charAt的使用示例
2014/02/18 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
学习python处理python编码问题
2011/03/13 Python
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
python基础教程之匿名函数lambda
2017/01/17 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
Python多层装饰器用法实例分析
2018/02/09 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
如何通过python画loss曲线的方法
2019/06/26 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
keras.layer.input()用法说明
2020/06/16 Python
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
波兰在线运动商店:YesSport
2020/07/23 全球购物
啤酒销售实习自我鉴定
2013/09/24 职场文书
2015年见习期工作总结
2014/12/12 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
2016年教师新年寄语
2015/08/18 职场文书
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python