深入理解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 相关文章推荐
IE浏览器打印的页眉页脚设置解决方法
Dec 08 Javascript
JS Excel读取和写入操作(模板操作)实现代码
Apr 11 Javascript
javascript实现的简单的表单验证
Jul 10 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
Aug 29 Javascript
jQuery包裹节点用法完整示例
Sep 13 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
Nov 07 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
Dec 28 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
Aug 09 Javascript
Python版实现微信公众号扫码登陆
May 28 Javascript
react ant Design手动设置表单的值操作
Oct 31 Javascript
使用webpack和rollup打包组件库的方法
Feb 25 Javascript
js中Object.create实例用法详解
Oct 05 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检测用户当前使用的浏览器是否为IE浏览器
2013/12/03 PHP
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
如何判断元素是否为HTMLElement元素
2013/12/06 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
2016/05/18 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
js HTML5 Canvas绘制转盘抽奖
2020/09/13 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&amp;”)
2016/12/23 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
JS判断时间段的实现代码
2017/06/14 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
用python删除java文件头上版权信息的方法
2014/07/31 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
单利模式及python实现方式详解
2018/03/20 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
车间班长岗位职责
2013/11/30 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
师范毕业生求职信
2014/07/11 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
会计做账心得体会
2016/01/22 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书