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 相关文章推荐
jQuery 跨域访问问题解决方法
Dec 02 Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
Jan 15 Javascript
吐槽一下我所了解的Node.js
Oct 08 Javascript
JavaScript实现三阶幻方算法谜题解答
Dec 29 Javascript
javascript中indexOf技术详解
May 07 Javascript
JS获取多维数组中相同键的值实现方法示例
Jan 06 Javascript
JavaScript实现跟随滚动缓冲运动广告框
Jul 15 Javascript
vue中element组件样式修改无效的解决方法
Feb 03 Javascript
jQuery表单元素过滤选择器用法实例分析
Feb 20 jQuery
layui实现tab的添加拒绝重复的方法
Sep 04 Javascript
转换layUI的数据表格中的日期格式方法
Sep 19 Javascript
Node登录权限验证token验证实现的方法示例
May 25 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多线程编程之管道通信实例分析
2015/03/07 PHP
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
List Installed Hot Fixes
2007/06/12 Javascript
js获取RadioButtonList的Value/Text及选中值等信息实现代码
2013/03/05 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
2015/11/13 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
js实现轮播图特效
2020/05/28 Javascript
Python的内存泄漏及gc模块的使用分析
2014/07/16 Python
python随机生成指定长度密码的方法
2015/04/04 Python
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
2020/10/23 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
实习单位接收函模板
2014/01/10 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
2015年度党员个人总结
2015/02/14 职场文书
正确使用MySQL update语句
2021/05/26 MySQL
Python中else的三种使用场景
2021/06/16 Python
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS