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中匿名函数,函数直接量和闭包
May 08 Javascript
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
Oct 01 Javascript
JavaScript操纵窗口的方法小结
Jun 28 Javascript
JS实现QQ图片一闪一闪的效果小例子
Jul 31 Javascript
jQuery Html控件基本操作(日常收集整理)
Mar 11 Javascript
javascript实现简单的on事件绑定
Aug 23 Javascript
HTML5 实现的一个俄罗斯方块实例代码
Sep 19 Javascript
浅谈在js传递参数中含加号(+)的处理方式
Oct 11 Javascript
JS实现页面跳转参数不丢失的方法
Nov 28 Javascript
vue指令以及dom操作详解
Mar 04 Javascript
layui use 定义js外部引用函数的方法
Sep 26 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 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
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
PHP的博客ping服务代码
2012/02/04 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
Iframe 自适应高度并实时监控高度变化的js代码
2009/10/30 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
javascript如何创建表格(javascript绘制表格的二种方法)
2013/12/10 Javascript
jQuery拖拽div实现思路
2014/02/19 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
详解vue父子组件间传值(props)
2017/06/29 Javascript
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
原生js实现简单的焦点图效果实例
2017/12/14 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
python使用正则表达式替换匹配成功的组
2017/11/17 Python
Python实现多线程的两种方式分析
2018/08/29 Python
django使用LDAP验证的方法示例
2018/12/10 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
Django choices下拉列表绑定实例
2020/03/13 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
超市督导岗位职责
2015/04/10 职场文书
基于Python编写一个监控CPU的应用系统
2022/06/25 Python