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 27 Javascript
关于jQuery UI 使用心得及技巧
Oct 10 Javascript
AngularJS语法详解(续)
Jan 23 Javascript
原生js实现类似弹窗抖动效果
Apr 02 Javascript
用jQuery实现可输入多选下拉组合框实例代码
Jan 18 Javascript
babel基本使用详解
Feb 17 Javascript
jQuery给表格添加分页效果
Mar 02 Javascript
JavaScript编写一个贪吃蛇游戏
Mar 09 Javascript
Angularjs 手写日历的实现代码(不用插件)
Oct 18 Javascript
如何编写一个d.ts文件的步骤详解
Apr 13 Javascript
vue中如何去掉空格的方法实现
Nov 09 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
Apr 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
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
PHP异常处理浅析
2015/05/12 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
vue实现评论列表功能
2019/10/25 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
讲解Python中if语句的嵌套用法
2015/05/14 Python
Python3.6正式版新特性预览
2016/12/15 Python
python连接数据库的方法
2017/10/19 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
Python环境Pillow( PIL )图像处理工具使用解析
2019/09/12 Python
Python笔记之代理模式
2019/11/20 Python
Python识别html主要文本框过程解析
2020/02/18 Python
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
信息技术专业个人自我评价
2013/12/11 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
期末复习计划
2015/01/19 职场文书
2015年校医个人工作总结
2015/07/24 职场文书
开学典礼校长致辞
2015/07/29 职场文书
Python办公自动化解决world文件批量转换
2021/09/15 Python