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 相关文章推荐
来自国外的14个图片放大编辑的jQuery插件整理
Oct 20 Javascript
JQuery实现鼠标移动到图片上显示边框效果
Jan 09 Javascript
jQuery写fadeTo示例代码
Feb 21 Javascript
js获取 type=radio 值的方法
May 09 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
Sep 21 Javascript
纯JavaScript手写图片轮播代码
Oct 20 Javascript
Angular项目如何升级至Angular6步骤全纪录
Sep 03 Javascript
layui实现给某一列加点击事件
Oct 26 Javascript
js实现计时器秒表功能
Dec 16 Javascript
微信小程序缓存支持二次开发封装实现解析
Dec 16 Javascript
node.JS路径解析之PATH模块使用方法详解
Feb 06 Javascript
JavaScript实现留言板案例
Mar 17 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 小心urldecode引发的SQL注入漏洞
2011/10/27 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
Yii2单元测试用法示例
2016/11/12 PHP
javascript web对话框与弹出窗口
2009/02/22 Javascript
javascript实现日历控件(年月日关闭按钮)
2012/12/12 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
原生JavaScript之es6中Class的用法分析
2020/02/23 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
Python进程间通信用法实例
2015/06/04 Python
在Django的URLconf中使用多个视图前缀的方法
2015/07/18 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
Python将list中的string批量转化成int/float的方法
2018/06/26 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
python实现加密的方式总结
2020/01/19 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
Html5获取高德地图定位天气的方法
2019/12/26 HTML / CSS
卫校毕业生自我鉴定
2013/10/31 职场文书
零件设计自荐信范文
2013/11/27 职场文书
村委会贫困证明
2014/01/14 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
2015年教育实习工作总结
2015/04/24 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript