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中dom操作和事件的实例学习-表单验证
Nov 30 Javascript
js实现俄罗斯方块小游戏分享
Jan 31 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
Apr 22 Javascript
用javascript将数据导入Excel示例代码
Sep 10 Javascript
JavaScript面向对象的实现方法小结
Apr 14 Javascript
javascript设置和获取cookie的方法实例详解
Jan 05 Javascript
Vue制作Todo List网页
Apr 26 Javascript
vue.js todolist实现代码
Oct 29 Javascript
vue + vuex todolist的实现示例代码
Mar 09 Javascript
解决vue 单文件组件中样式加载问题
Apr 24 Javascript
微信小程序修改数组长度的问题的解决
Dec 17 Javascript
vue相关配置文件详解及多环境配置详细步骤
May 19 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/07/05 PHP
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
yii2 url重写并隐藏index.php方法
2018/12/10 PHP
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
理解JavaScript中的对象 推荐
2011/01/09 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
JS判断浏览器是否支持某一个CSS3属性的方法
2014/10/17 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
BootStrap Fileinput上传插件使用实例代码
2017/07/28 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
如何把vuejs打包出来的文件整合到springboot里
2018/07/26 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
用Python进行TCP网络编程的教程
2015/04/29 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
公司开业庆典主持词
2014/03/21 职场文书
七夕活动策划方案
2014/08/16 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
PHP中多字节字符串操作实例详解
2021/08/23 PHP