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读取ASP设定的COOKIE
Feb 15 Javascript
javascript学习笔记(六)数据类型和JSON格式
Oct 08 Javascript
node.js中的http.get方法使用说明
Dec 14 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
Dec 18 Javascript
jQuery中odd选择器的定义和用法
Dec 23 Javascript
javascript实现无法关闭的弹框
Nov 27 Javascript
AngularJS ionic手势事件的使用总结
Aug 09 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
Sep 19 Javascript
微信小程序mpvue点击按钮获取button值的方法
May 29 Javascript
详解vuex的简单todolist例子
Jul 14 Javascript
element中的$confirm的使用
Apr 26 Javascript
vue动态绑定style样式
Apr 20 Vue.js
一文让你彻底搞清楚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
菜鸟修复电子管记
2021/03/02 无线电
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
基于jquery的3d效果实现代码
2011/03/23 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
js仿微信语音播放实现思路
2016/12/12 Javascript
解析Vue2.0双向绑定实现原理
2017/02/23 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
使用Vue生成动态表单
2019/11/26 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
对python mayavi三维绘图的实现详解
2019/01/08 Python
python文本数据处理学习笔记详解
2019/06/17 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
在C#中如何实现多态
2014/07/02 面试题
乡下人家教学反思
2014/02/01 职场文书
军训 自我鉴定
2014/02/03 职场文书
办公室主任岗位职责
2015/01/31 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书