React.js绑定this的5种方法(小结)


Posted in Javascript onJune 05, 2018

this在javascript中已经相当灵活,把它放到React中给我们的选择就更加困惑了。下面一起来看看React this的5种绑定方法。

1.使用React.createClass

如果你使用的是React 15及以下的版本,你可能使用过React.createClass函数来创建一个组件。你在里面创建的所有函数的this将会自动绑定到组件上。

const App = React.createClass({
 handleClick() {
  console.log('this > ', this); // this 指向App组件本身
 },
 render() {
  return (
   <div onClick={this.handleClick}>test</div>
  );
 }
});

但是需要注意随着React 16版本的发布官方已经将改方法从React中移除

2.render方法中使用bind

如果你使用React.Component创建一个组件,在其中给某个组件/元素一个onClick属性,它现在并会自定绑定其this到当前组件,解决这个问题的方法是在事件函数后使用.bing(this)将this绑定到当前组件中。

class App extends React.Component {
 handleClick() {
  console.log('this > ', this);
 }
 render() {
  return (
   <div onClick={this.handleClick.bind(this)}>test</div>
  )
 }
}

这种方法很简单,可能是大多数初学开发者在遇到问题后采用的一种方式。然后由于组件每次执行render将会重新分配函数这将会影响性能。特别是在你做了一些性能优化之后,它会破坏PureComponent性能。不推荐使用

3.render方法中使用箭头函数

这种方法使用了ES6的上下文绑定来让this指向当前组件,但是它同第2种存在着相同的性能问题,不推荐使用

class App extends React.Component {
 handleClick() {
  console.log('this > ', this);
 }
 render() {
  return (
   <div onClick={e => this.handleClick(e)}>test</div>
  )
 }
}

下面的方法可以避免这些麻烦,同时也没有太多额外的麻烦。

4.构造函数中bind

为了避免在render中绑定this引发可能的性能问题,我们可以在constructor中预先进行绑定。

class App extends React.Component {
 constructor(props) {
  super(props);
  this.handleClick = this.handleClick.bind(this);
 }
 handleClick() {
  console.log('this > ', this);
 }
 render() {
  return (
   <div onClick={this.handleClick}>test</div>
  )
 }
}

然后这种方法很明显在可读性和维护性上没有第2种和第3种有优势,但是第2种和第3种由于存在潜在的性能问题不推荐使用,那么现在推荐 ECMA stage-2 所提供的箭头函数绑定。

5.在定义阶段使用箭头函数绑定

要使用这个功能,需要在.babelrc种开启stage-2功能,绑定方法如下:

class App extends React.Component {
 constructor(props) {
  super(props);
 }
 handleClick = () => {
  console.log('this > ', this);
 }
 render() {
  return (
   <div onClick={this.handleClick}>test</div>
  )
 }
}

这种方法有很多优化:

  1. 箭头函数会自动绑定到当前组件的作用域种,不会被call改变
  2. 它避免了第2种和第3种的可能潜在的性能问题
  3. 它避免了第4种绑定时大量重复的代码

总结:

如果你使用ES6和React 16以上的版本,最佳实践是使用第5种方法来绑定this

参考资料:

React.js pure render性能渲染反模式

this绑定装饰器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
URL编码转换,escape() encodeURI() encodeURIComponent()
Dec 27 Javascript
用js获取电脑信息(是使用与IE浏览器)
Jan 15 Javascript
js时间比较示例分享(日期比较)
Mar 05 Javascript
js正则表达式中exec用法实例
Jul 23 Javascript
浅谈javascript:两种注释,声明变量,定义函数
Sep 29 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
Feb 16 Javascript
JavaScript实现移动端轮播效果
Jun 06 Javascript
vue使用axios时关于this的指向问题详解
Dec 22 Javascript
微信小程序实现手势图案锁屏功能
Jan 30 Javascript
vue返回上一页面时回到原先滚动的位置的方法
Dec 20 Javascript
js实现简易拖拽的示例
Oct 26 Javascript
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
Apr 13 Javascript
微信小程序实现城市列表选择
Jun 05 #Javascript
vue.js将时间戳转化为日期格式的实现代码
Jun 05 #Javascript
如何使node也支持从url加载一个module详解
Jun 05 #Javascript
Js中将Long转换成日期格式的实现方法
Jun 05 #Javascript
JS非行间样式获取函数的实例代码
Jun 05 #Javascript
JavaScript实现读取与输出XML文件数据的方法示例
Jun 05 #Javascript
Node错误处理笔记之挖坑系列教程
Jun 05 #Javascript
You might like
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
php中青蛙跳台阶的问题解决方法
2018/10/14 PHP
PHP7.3.10编译安装教程
2019/10/08 PHP
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
七个很有意思的PHP函数
2014/05/12 Javascript
JS实现最简单的冒泡排序算法
2017/02/15 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
JS实现简易留言板增删功能
2020/02/08 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
Vue自定义组件双向绑定实现原理及方法详解
2020/09/03 Javascript
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
12步教你理解Python装饰器
2016/02/25 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
代码实例讲解python3的编码问题
2019/07/08 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
python map比for循环快在哪
2020/09/21 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
大学生职业生涯规划书
2014/03/14 职场文书
三月雷锋月活动总结
2014/07/03 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android