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 相关文章推荐
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
Aug 31 Javascript
Js base64 加密解密介绍
Oct 11 Javascript
jquery和ajax的关系详细介绍
Nov 29 Javascript
Javascript判断图片尺寸大小实例分析
Jun 16 Javascript
DOM基础教程之使用DOM控制表格
Jan 20 Javascript
如何让一个json文件显示在表格里【实现代码】
May 09 Javascript
BootStrap的table表头固定tbody滚动的实例代码
Aug 24 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
JS中with的替代方法与String中的正则方法详解
Dec 23 Javascript
单行 JS 实现移动端金钱格式的输入规则
May 22 Javascript
详解Angular2 关于*ngFor 嵌套循环
May 22 Javascript
layui弹出框Tab选项卡的示例代码
Sep 04 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实现MVC开发得最简单的方法――模型
2007/04/10 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
Add Formatted Text to a Word Document
2007/06/15 Javascript
JavaScript的变量作用域深入理解
2009/10/25 Javascript
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
jquery输入数字随机抽奖特效的简单实现代码
2016/06/10 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
Python装饰器的函数式编程详解
2015/02/27 Python
以一段代码为实例快速入门Python2.7
2015/03/31 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
浅析python继承与多重继承
2018/09/13 Python
Python高斯消除矩阵
2019/01/02 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
Python imread、newaxis用法详解
2019/11/04 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
Python远程方法调用实现过程解析
2020/07/28 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
合理化建议书
2015/02/04 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
Python循环之while无限迭代
2022/04/30 Python