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背投广告代码的完善
Apr 08 Javascript
jquery 经典动画菜单效果代码
Jan 26 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
Jan 24 Javascript
JavaScript cookie的设置获取删除详解
Feb 11 Javascript
JavaScript 学习笔记之操作符
Jan 14 Javascript
javascript实现可全选、反选及删除表格的方法
May 15 Javascript
对JavaScript客户端应用编程的一些建议
Jun 24 Javascript
JS DOM实现鼠标滑动图片效果
Sep 17 Javascript
基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)
Sep 02 Javascript
浅谈在js传递参数中含加号(+)的处理方式
Oct 11 Javascript
js实现无缝轮播图插件封装
Jul 31 Javascript
微信小程序实现拼图小游戏
Oct 22 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
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
2013/06/21 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
javascript 学习之旅 (2)
2009/02/05 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
jQuery获取Radio,CheckBox选择的Value值(示例代码)
2013/12/12 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
Angular2库初探
2017/03/01 Javascript
初学者AngularJS的环境搭建过程
2017/10/27 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
Python中进程和线程的区别详解
2017/10/29 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
flask框架中勾子函数的使用详解
2018/08/01 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
亚洲领先的设计购物网站:Pinkoi
2020/11/26 全球购物
GWT都有什么特性
2016/12/02 面试题
应届毕业生应聘自荐信
2013/12/07 职场文书
学习决心书范文
2014/03/11 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
党小组鉴定意见
2015/06/02 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android