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 获取json数据实现代码
Apr 27 Javascript
jquery的Theme和Theme Switcher使用小结
Sep 08 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
Feb 23 Javascript
图片延迟加载的实现代码(模仿懒惰)
Mar 29 Javascript
jQuery实现的简洁下拉菜单导航效果代码
Aug 26 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
Dec 08 Javascript
20行JS代码实现网页刮刮乐效果
Jun 23 Javascript
基于jQuery实现定位导航位置效果
Nov 15 jQuery
jQuery each和js forEach用法比较
Feb 27 jQuery
js通过循环多张图片实现动画效果
Dec 19 Javascript
js实现整体缩放页面适配移动端
Mar 31 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 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
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
实现JavaScript中继承的三种方式
2009/10/16 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
JS实现复制功能
2017/03/01 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
详解vue的双向绑定原理及实现
2019/05/05 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
初步理解Python进程的信号通讯
2015/04/09 Python
Python 基础教程之str和repr的详解
2017/08/20 Python
python程序 创建多线程过程详解
2019/09/23 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
django有哪些好处和优点
2020/09/01 Python
详解Python流程控制语句
2020/10/28 Python
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
杭州时比特电子有限公司SQL
2013/08/22 面试题
武汉某公司的C#笔试题面试题
2015/12/25 面试题
技术学校毕业生求职信分享
2013/12/02 职场文书
岗位竞聘演讲稿
2014/01/10 职场文书
酒店销售经理岗位职责
2014/01/31 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
SQL之各种join小结详细讲解
2021/08/04 MySQL