深入理解React中es6创建组件this的方法


Posted in Javascript onAugust 29, 2016

首发于:https://mingjiezhang.github.io/。

在JavaScript中,this对象是运行时基于函数的执行环境(也就是上下文)绑定的。

从react中的demo说起

Facebook最近一次更新react时,将es6中的class加入了组件的创建方式当中。Facebook也推荐组件创建使用通过定义一个继承自 React.Component 的class来定义一个组件类。官方的demo:

class LikeButton extends React.Component {
constructor() {
super();
this.state = {
liked: false
};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState({liked: !this.state.liked});
}
render() {
const text = this.state.liked ? 'liked' : 'haven\'t liked';
return (
<div onClick={this.handleClick}>
You {text} this. Click to toggle.
</div>
);
}
}
ReactDOM.render(
<LikeButton />,
document.getElementById('example')
);

上面的demo中有大量this的使用,在 class LikeButton extends React.Component 中我们是声明该class,因为this具体是由其上下文决定的,因此在类定义中我们无法得知this用法。 相当于是new了上面定义的类,首先调用 constructor() 函数, this.state 的this上下文就是该实例对象;同理,render() 函数中 this.state.liked 的this上下文也是该对象。问题在于 onClick={this.handleClick} ,获取该函数引用是没有问题,这里的this上下文就是该对象。

这时问题来了,在原来 React.createClass 中, handleClick() 在onClick事件触发的时候,会自动绑定到LikeButton实例上,这时候该函数的this的上下文就是该实例。不过在ES6的class的写法中,Facebook取消了自动绑定,实例化LikeButton后,handleClick()的上下文是div的支撑实例( backing instance ),而 handleClick() 原本要绑定的上下文是LikeButton的实例。对于该问题,我们有多种解决方案。

使用bind()函数改变this的上下文

可以在class声明中的constructor()函数中,使用

this.handleClick = this.handleClick.bind(this);

该方法是一个bind()绑定,多次使用。在该方法中,我们在声明该实例后,可以在该实例任何地方使用 handleClick() 函数,并且该 handleClick() 函数的this的上下文都是LikeButton实例对象。

除此我们也可以在具体使用该函数的地方绑定this的上下文到LikeButton实例对象,代码如下

<div onClick={this.handleClick.bind(this)}>
You {text} this. Click to toggle.
</div>

这种方法需要我们每次使用bind()函数绑定到组件对象上。

es6的箭头函数

es6中新加入了箭头函数=>,箭头函数除了方便之外还有而一个特征就是将函数的this绑定到其定义时所在的上下文。这个特征也可以帮助我们解决这个问题。使用如下代码:

<div onClick={() => this.handleClick()}>
You {text} this. Click to toggle.
</div>

这样该 this.handleClick() 的上下文就会被绑定到LikeButton的实例对象上。个人认为,使用箭头函数使得JavaScript更加接近面向对象的编程风格。

this的总结

this的本质就是:this跟作用域无关的,只跟执行上下文有关。

以上所述是小编给大家介绍的React中es6创建组件this的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript options属性集合操作代码
Dec 28 Javascript
不要在cookie中使用特殊字符的原因分析
Jul 13 Javascript
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
Dec 10 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
Mar 14 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
Jul 09 Javascript
javascript中interval与setTimeOut的区别示例介绍
Mar 14 Javascript
JavaScript闭包实例讲解
Apr 22 Javascript
jQuery的ready方法详解
Nov 27 Javascript
jquery实现select选择框内容左右移动代码分享
Nov 21 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
Jun 04 Javascript
CSS3+JavaScript实现翻页幻灯片效果
Jun 28 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
Dec 29 Javascript
Ionic默认的Tabs模板使用实例
Aug 29 #Javascript
关于Javascript回调函数的一个妙用
Aug 29 #Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
Aug 28 #Javascript
利用jQuery的动画函数animate实现豌豆发射效果
Aug 28 #Javascript
教你如何在Node.js中使用jQuery
Aug 28 #Javascript
分享JavaScript监听全部Ajax请求事件的方法
Aug 28 #Javascript
Node.js 日志处理模块log4js
Aug 28 #Javascript
You might like
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
DWZ table的原生分页浅谈
2013/03/01 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
ES6解构赋值实例详解
2017/10/31 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
javascript canvas封装动态时钟
2020/09/30 Javascript
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
python内存动态分配过程详解
2019/07/15 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
Python内置加密模块用法解析
2019/11/25 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
大专毕业生简历的自我评价
2013/10/20 职场文书
应届毕业生专业个人求职自荐信格式
2013/11/20 职场文书
金融行业务员的自我评价
2013/12/13 职场文书
开学典礼感言
2014/02/16 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
写给妈妈的感谢信
2015/01/22 职场文书
网络销售员岗位职责
2015/04/11 职场文书
2015少先队大队辅导员工作总结
2015/07/24 职场文书
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers