深入理解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 相关文章推荐
jQuery代码优化之基本事件
Nov 01 Javascript
jQuery拖动图片删除示例
May 10 Javascript
js控制容器隐藏出现防止样式变化的两种方法
Apr 25 Javascript
JS实现文件动态顺序载入的方法
Mar 07 Javascript
JavaScript使用yield模拟多线程的方法
Mar 19 Javascript
JQuery包裹DOM节点的方法
Jun 11 Javascript
js游戏人物上下左右跑步效果代码分享
Aug 28 Javascript
JS中位置与大小的获取方法
Nov 22 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
Dec 08 Javascript
JavaScript用二分法查找数据的实例代码
Jun 17 Javascript
vuex分模块后,实现获取state的值
Jul 26 Javascript
手把手教你如何编译打包video.js
Dec 09 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关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
简单的php数据库操作类代码(增,删,改,查)
2013/04/08 PHP
解析PHP中ob_start()函数的用法
2013/06/24 PHP
session 加入redis的实现代码
2016/07/15 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
python获取图片颜色信息的方法
2015/03/18 Python
浅析Python编写函数装饰器
2016/03/18 Python
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
如何利用python发送邮件
2020/09/26 Python
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
教师评优事迹材料
2014/01/10 职场文书
农业开发项目建议书
2014/05/16 职场文书
公开承诺书格式
2014/05/21 职场文书
联片教研活动总结
2014/07/01 职场文书
市委常委会班子党的群众路线教育实践活动整改方案
2014/10/25 职场文书
工人先锋号申报材料
2014/12/29 职场文书
人事文员岗位职责
2015/02/04 职场文书
超市员工辞职信范文
2015/05/12 职场文书
2016年师德学习心得体会
2016/01/12 职场文书