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 相关文章推荐
定义select的边框颜色
Apr 28 Javascript
javascript 检测浏览器类型和版本的代码
Sep 15 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
Sep 14 Javascript
jquery获取easyui日期控件的值实现方法
Nov 09 Javascript
Web前端框架bootstrap实战【第一次接触使用】
Dec 28 Javascript
js实现自动图片轮播代码
Mar 22 Javascript
详解Angular-Cli中引用第三方库
May 21 Javascript
基于vue2.0实现的级联选择器
Jun 09 Javascript
详解ES6中的代理模式——Proxy
Jan 08 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
Aug 13 Javascript
关于vue项目中搜索节流的实现代码
Sep 17 Javascript
使用vuex-persistedstate本地存储vuex
Apr 29 Vue.js
微信小程序实现城市列表选择
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
zend framework多模块多布局配置
2011/02/26 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
PHP swfupload图片上传的实例代码
2013/09/30 PHP
PHP 动态生成静态HTML页面示例代码
2014/01/15 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
jQuery 使用个人心得
2009/02/26 Javascript
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
Python中的startswith和endswith函数使用实例
2014/08/25 Python
Python编程中的反模式实例分析
2014/12/08 Python
Python中的面向对象编程详解(下)
2015/04/13 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
python SQLAlchemy的Mapping与Declarative详解
2019/07/04 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
python 深度学习中的4种激活函数
2020/09/18 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
医药专业推荐信
2013/11/15 职场文书
实习鉴定范文
2013/12/19 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
工商干部先进事迹
2014/05/14 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
关于倡议书的范文
2015/04/29 职场文书
赡养老人协议书范本
2015/08/06 职场文书
初中体育教学随笔
2015/08/15 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书