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 相关文章推荐
自动更新作用
Oct 08 Javascript
JS去除字符串的空格增强版(可以去除中间的空格)
Aug 26 Javascript
js 屏蔽鼠标右键脚本附破解方法
Dec 03 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
Mar 29 Javascript
JavaScript获取网页支持表单字符集的方法
Apr 02 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
Mar 18 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
Mar 10 Javascript
vuex与组件联合使用的方法
May 10 Javascript
Vue中的v-for循环key属性注意事项小结
Aug 12 Javascript
Vue传参一箩筐(页面、组件)
Apr 04 Javascript
使用webpack将ES6转化ES5的实现方法
Oct 13 Javascript
通过实例解析jQ Ajax操作相关原理
Sep 23 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
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
2006/10/09 PHP
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
检查php文件中是否含有bom的函数
2012/05/31 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
PHP时间类完整代码实例
2021/02/26 PHP
javascript 模拟点击广告
2010/01/02 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
jquery实现页面常用的返回顶部效果
2016/03/04 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
Python pickle模块用法实例分析
2015/05/27 Python
python基于pygame实现响应游戏中事件的方法(附源码)
2015/11/11 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
python多线程使用方法实例详解
2019/12/30 Python
Python如何通过百度翻译API实现翻译功能
2020/04/02 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
CSS中几个与换行有关的属性简明总结
2014/04/15 HTML / CSS
意大利单身交友网站:Meetic
2020/07/12 全球购物
安踏广告词改编版
2014/03/21 职场文书
篮球比赛策划方案
2014/06/05 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书
寒山寺导游词
2015/02/03 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python
详解Oracle块修改跟踪功能
2021/11/07 Oracle