深入理解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 类与静态类的实现
Apr 01 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
Apr 12 Javascript
jQuery过滤选择器:not()方法使用介绍
Apr 20 Javascript
js实现二级菜单渐隐显示
Nov 03 Javascript
jQuery动画效果图片轮播特效
Jan 12 Javascript
ionic2打包android时gradle无法下载的解决方法
Apr 05 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
Apr 28 jQuery
vue项目实战总结篇
Feb 11 Javascript
jQuery实现图片下载代码
Jul 18 jQuery
js 获取扫码枪输入数据的方法
Jun 10 Javascript
vue 在methods中调用mounted的实现操作
Aug 07 Javascript
Openlayers3实现车辆轨迹回放功能
Sep 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
自动分页的不完整解决方案
2007/01/12 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
javascript 写的一个简单的timer
2009/07/30 Javascript
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
Js 中debug方式
2010/02/07 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
详解js闭包
2014/09/02 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
JavaScript判断按钮被点击的方法
2015/12/13 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
javascript正则表达式定义(语法)总结
2016/01/08 Javascript
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
python基础教程之udp端口扫描
2014/02/10 Python
python分析apache访问日志脚本分享
2015/02/26 Python
利用Python如何生成随机密码
2016/04/20 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
python检测IP地址变化并触发事件
2018/12/26 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
pandas 层次化索引的实现方法
2019/07/06 Python
Python中url标签使用知识点总结
2020/01/16 Python
python实现在内存中读写str和二进制数据代码
2020/04/24 Python
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
高中运动会广播稿
2014/01/21 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
中秋节随笔
2015/08/15 职场文书
SQL Server删除表中的重复数据
2022/05/25 SQL Server