深入理解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 相关文章推荐
splice slice区别
Oct 09 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
Nov 09 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
Sep 14 Javascript
在jQuery中 常用的选择器介绍
Apr 16 Javascript
div模拟选择框示例代码
Nov 03 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
Jan 10 Javascript
Jquery中map函数的用法
Jun 03 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
Sep 01 Javascript
Angularjs 与 bower安装和使用详解
May 11 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
Oct 10 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
Mar 11 Javascript
el-form 多层级表单的实现示例
Sep 10 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学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
php 操作符与控制结构
2012/03/07 PHP
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
javascript中length属性的探索
2011/07/31 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
拖动时防止选中
2017/02/03 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
微信小程序支付前端源码
2018/08/29 Javascript
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python上下文管理器和with块详解
2017/09/09 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
Python换行与不换行的输出实例
2020/02/19 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
UNIX文件系统分类
2014/11/11 面试题
护理职业生涯规划书
2014/01/24 职场文书
租房安全协议书
2014/08/20 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS
django学习之ajax post传参的2种格式实例
2021/05/14 Python
基于JavaScript实现年月日三级联动
2021/06/22 Javascript
MySQL开启事务的方式
2021/06/26 MySQL
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS