深入理解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 相关文章推荐
图片翻转效果具体实现代码
Jan 09 Javascript
js校验表单后提交表单的三种方法总结
Feb 28 Javascript
javascript中checkbox使用方法简单实例演示
Nov 17 Javascript
jQuery链式调用与show知识浅析
May 11 Javascript
深入理解JavaScript单体内置对象
Jun 06 Javascript
Google Maps基础及实例解析
Aug 06 Javascript
关于页面刷新vuex数据消失问题解决方案
Jul 03 Javascript
微信小程序滑动选择器的实现代码
Aug 10 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
Aug 12 Javascript
脚手架vue-cli工程webpack的基本用法详解
Sep 29 Javascript
微信小程序开发注意指南和优化实践(小结)
Jun 21 Javascript
js 数据类型判断的方法
Dec 03 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
php4的session功能评述(二)
2006/10/09 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
php将gd生成的图片缓存到memcache的小例子
2013/06/05 PHP
ini_set的用法介绍
2014/01/07 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
深入理解PHP之OpCode原理详解
2016/06/01 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
2017/03/13 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
RR vs IO BO3 第一场2.13
2021/03/10 DOTA
JavaScript For Beginners(转载)
2007/01/05 Javascript
基于jquery的回到页面顶部按钮
2011/06/27 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
[00:36]DOTA2风云人物相约完美“圣”典 12月17日不见不散
2016/11/30 DOTA
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
深入浅析python继承问题
2016/05/29 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
2018/02/21 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
物流专业求职计划书
2014/01/10 职场文书
公司司机岗位职责
2014/02/07 职场文书
党员公开承诺书和承诺事项
2014/03/25 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
muduo TcpServer模块源码分析
2022/04/26 Redis