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 相关文章推荐
[HTML/CSS/Javascript]WWTJS
Sep 25 Javascript
Jquery常用技巧收集整理篇
Nov 14 Javascript
js 利用className得到对象的实现代码
Nov 15 Javascript
文本框获得焦点和失去焦点的判断代码
Mar 18 Javascript
js hover 定时器(实例代码)
Nov 12 Javascript
Javascript快速排序算法详解
Dec 03 Javascript
JS实现简单的二维矩阵乘积运算
Jan 26 Javascript
Angular2  NgModule 模块详解
Oct 19 Javascript
基于 Vue 实现一个酷炫的 menu插件
Nov 14 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
Dec 04 Javascript
微信小程序实现禁止分享代码实例
Oct 19 Javascript
node.js实现简单的压缩/解压缩功能示例
Nov 05 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
加速XP搜索功能堪比vista
2007/03/22 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
php常用数学函数汇总
2014/11/21 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
2015/10/08 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
Python字符转换
2008/09/06 Python
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
船餐厅和泰晤士河餐饮游轮:Bateaux London
2018/03/19 全球购物
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
化学实验员岗位职责
2013/12/28 职场文书
党员个人党性分析材料
2014/12/18 职场文书
车间主任岗位职责
2015/02/03 职场文书
CSS实现章节添加自增序号的方法
2021/06/23 HTML / CSS
基于Python实现nc批量转tif格式
2022/08/14 Python