深入理解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的parseInt 进制问题
May 07 Javascript
jQuery 表格插件整理
Apr 27 Javascript
用jQuery模拟页面加载进度条的实现代码
Dec 19 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
Dec 11 Javascript
js中substring和substr的定义和用法
May 05 Javascript
JavaScript结合AJAX_stream实现流式显示
Jan 08 Javascript
canvas实现十二星座星空图
Feb 14 Javascript
BootStrap导航栏问题记录
Jul 31 Javascript
解决Vue打包之后文件路径出错的问题
Mar 06 Javascript
通过函数作用域和块级作用域看javascript的作用域链
Aug 05 Javascript
详解vue 自定义marquee无缝滚动组件
Apr 09 Javascript
JSON 入门教程基础篇 json入门学习笔记
Sep 22 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内核探索:变量存储与类型使用说明
2014/01/30 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
PHP人民币金额转大写实例代码
2015/10/02 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
javascript闭包的理解
2015/04/01 Javascript
JQuery球队选择实例
2015/05/18 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
详解JavaScript中的六种错误类型
2017/09/21 Javascript
小程序实现五星点评效果
2018/11/03 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
[48:00]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第二场 11.04
2020/11/04 DOTA
python生成器generator用法实例分析
2015/06/04 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
深入了解Django中间件及其方法
2019/07/26 Python
python反转列表的三种方式解析
2019/11/08 Python
美国领先的奢侈美容零售商:Bluemercury
2017/07/26 全球购物
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
Nordgreen美国官网:在线购买极简主义斯堪的纳维亚手表
2019/07/24 全球购物
小学校长先进事迹材料
2014/05/13 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
身边的榜样活动方案
2014/08/20 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
大学辅导员述职报告
2015/01/10 职场文书
党小组考察意见
2015/06/02 职场文书