热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

React类,要领绑定(第三部份)

这是React和ECMAScript6/ECMAScript7连系运用系列文章的第三篇。下面是一切系列文章章节的链接:React、ES6–引见(第一部份)React类、ES7属性初

这是React和ECMAScript6/ECMAScript7连系运用系列文章的第三篇。

下面是一切系列文章章节的链接:

  • React 、 ES6 – 引见(第一部份)

  • React类、ES7属性初始化(第二部份)

  • React类,要领绑定(第三部份)

  • ES6中React Mixins的运用(第四部份)

  • React 和ES6 之JSPM的运用(第五部份)

  • React 和 ES6 事情流之 Webpack的运用(第六部份)

本篇文章Github源码

ReactJS
《React类,要领绑定(第三部份)》《React类,要领绑定(第三部份)》

你在看上一篇文章中的CartItem render 要领中运用{this.increaseQty.bind(this)}代码时,你肯定会以为疑心。

假如我们尝试将{this.increaseQty.bind(this)}代码替换成{this.increaseQty},我们将在浏览器掌握台中发明以下毛病:Uncaught TypeError: Cannot read property 'setState' of undefined.

《React类,要领绑定(第三部份)》

这是由于我们当我们挪用一个用那种要领绑定的要领时,this不是类它本身,this未定义。相反,假如在案例中,React.createClass()一切的要领将会自动绑定对象的实例。这多是一些开发者的直觉。

No autobinding was the decision of React team when they implemented support of ES6 classes for React components. You could find out more about reasons for doing so in this blog post.

React team经由过程ES6来完成对React 组建的支撑时,没有设置自动绑定是React team的一个决议。在这篇博客中你能发明更多关于为何这么处置惩罚的缘由。

如今让我们来看看在你的JSX案例中,运用ES6类建立的要领的多种挪用要领。我所考虑到的多种差别的要领都在这个GitHub repository。

Method 1. 运用Function.prototype.bind().

之前我们已见到过:

export default class CartItem extends React.Component {
render() {

}
}

当任何ES6的通例要领在要领原型中举行this绑定时,this指向的是类实例。假如你想相识更多Function.prototype.bind(),你能够接见这篇MDN博客

Method 2. 在组织函数中定义函数

此要领是上一个与类组织函数的用法的夹杂:

export default class CartItem extends React.Component {
constructor(props) {
super(props);
this.increaseQty = this.increaseQty.bind(this);
}
render() {

}
}

你不要再次在JSX代码的别的处所举行绑定,然则这将增添组织函数中的代码量。

Method 3. 运用箭头函数和组织函数

ES6 fat arrow functions preserve this context when they are called. We could use this feature and redefine increaseQty() inside constructor in the following way:

当要领被挪用时,ES6 fat arrow functions会保存上下文。我们能运用这个特征用下面的要领在组织函数中重定义increaseQty()函数。

export default class CartItem extends React.Component {
constructor(props) {
super(props);
this._increaseQty = () => this.increaseQty();
}
render() {

}
}

Method 4. 运用箭头函数和ES2015+类属性

别的,你能够运用ES2015+类属性语法和箭头函数:

export default class CartItem extends React.Component {
increaseQty = () => this.increaseQty();
render() {

}
}

属性初始化和Method 3中的功用一样。

正告: 类属性还不是当前Javascript规范的一部份。然则你能够在Babel中自在的运用他们。你能够在这篇文章中相识更多类属性的运用。

Method 5. 运用 ES2015+ 函数绑定语法.

近来,Babel引见了Function.prototype.bind()::的运用。在这里我就不深切细节解说它事情的道理。有许多别的的小伙伴已有很圆满的诠释。你能够Google搜刮blog 2015 function bind相识更多细节。

下面是ES2015+函数绑定的运用:

export default class CartItem extends React.Component {
constructor(props) {
super(props);
this.increaseQty = ::this.increaseQty;
// line above is an equivalent to this.increaseQty = this.increaseQty.bind(this);
}
render() {

}
}

强调:这个特征是高度的试验,运用它你得本身负担风险。

Method 6. 在挪用要领的方运用 ES2015+ 函数绑定语法.

You also have a possibility to use ES2015+ function bind syntax directly in your JSX without touching constructor. It will look like:

你也能够直接在非组织函数内里的JSX内里直接运用ES2015+函数绑定。结果以下:

export default class CartItem extends React.Component {
render() {

}
}

异常简约,唯一的瑕玷是,这个函数将在每一个后续衬着组件上从新建立。这不是最好的。更主要的是,假如你运用像PureRenderMixin的东西将会涌现。

结论

在这篇文章中,我们已发明了多种React组建类要领的绑定要领。

参考文档

  • About autobinding in official React blog

  • Autobinding, React and ES6 Classes

  • Function Bind Syntax in official Babel blog

  • Function.prototype.bind()

  • Experimental ES7 Class Properties

  • Experimental ES7 Function Bind Syntax

扫码申请加入全栈部落
《React类,要领绑定(第三部份)》

推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路
    本文介绍了FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路。当图表系列较多时,用户希望可以自己设置哪些系列显示,哪些系列不显示。通过调用FR.Chart.WebUtils.getChart("chartID").getChartWithIndex(chartIndex).setSeriesVisible()接口,可以获取需要显示的系列图表对象,并在表单中显示这些系列。本文以决策报表为例,详细介绍了实现方法,并给出了示例。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
author-avatar
曾军78930
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有