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 相关文章推荐
禁止选中文字兼容IE、Chrome、FF等
Sep 04 Javascript
js动态拼接正则表达式的两种方法
Mar 04 Javascript
php,js,css字符串截取的办法集锦
Sep 26 Javascript
JavaScript获取浏览器信息的方法
Nov 20 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
Nov 30 Javascript
js中遍历Map对象的方法
Jul 27 Javascript
js禁止浏览器的回退事件
Apr 20 Javascript
jQuery 实现双击编辑表格功能
Jun 19 jQuery
快速解决brew安装特定版本flow的问题
May 17 Javascript
微信小程序实现工作时间段选择
Feb 15 Javascript
pm2发布node配置文件ecosystem.json详解
May 15 Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
Apr 14 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/05/04 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
2016/08/17 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
React中的refs的使用教程
2018/02/13 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
python3.5使用tkinter制作记事本
2016/06/20 Python
Python实现在线音乐播放器
2017/03/03 Python
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
Python代码实现KNN算法
2017/12/20 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
Python爬虫开发与项目实战
2020/12/16 Python
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
战略合作意向书范本
2014/04/01 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
基层党员公开承诺书
2014/05/29 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
老乡会致辞
2015/07/28 职场文书
2016年社区“6.26”禁毒日宣传活动总结
2016/04/05 职场文书
聊聊JS ES6中的解构
2021/04/29 Javascript
六个好看实用的 HTML + CSS 后台登录入口页面
2022/04/28 HTML / CSS