利用ES6语法重构React组件详解


Posted in Javascript onMarch 02, 2017

一、创建组件

ES6 class创建的组件语法更加简明,也更符合javascript。内部的方法不需要使用function关键字。

React.createClass

import React from 'react';
const MyComponent = React.createClass({
 render: function() {
 return (
  <div>以前的方式创建的组件</div>
 );
 }
});
export default MyComponent;

React.Component(ES6)

import React,{ Component } from 'react';
class MyComponent extends Component {
 render() {
 return (
  <div>ES6方式创建的组件</div>
 );
 }
}
export default MyComponent;

二、属性

props propTypes and getDefaultProps

. 使用React.Component创建组件,需要通过在constructor中调用super()将props传递给React.Component 。另外react 0.13之后props必须是不可变的。

. 由于是用ES6 class语法创建组件,其内部只允许定义方法,而不能定义属性,class的属性只能定义在class之外。所以propTypes要写在组件外部。

. 对于之前的getDefaultProps方法,由于props不可变,所以现在被定义为一个属性,和propTypes一样,要定义在class外部。

React.createClass

import React from 'react';
const MyComponent = React.createClass({
 propTypes: {
 nameProp: React.PropTypes.string
 },
 getDefaultProps() {
 return {
  nameProp: ''
 };
 },
 render: function() {
 return (
  <div>以前的方式创建的组件</div>
 );
 }
});
export default MyComponent;

React.Component(ES6)

import React,{ Component } from 'react';
class MyComponent extends Component {
 constructor(props) {
 super(props);
 }
 
 render() {
 return (
  <div>ES6方式创建的组件</div>
 );
 }
}
MyComponent.propTypes = {
 nameProp: React.PropTypes.string
};
MyComponent.defaultProps = {
 nameProp: ''
};
export default MyComponent;

三、状态

. 使用ES6 class语法创建组件,初始化state的工作要在constructor中完成。不需要再调用getInitialState方法。这种语法更加的符合JavaScript语言习惯。

React.createClass

import React from 'react';
const MyComponent = React.createClass({
 getInitialState: function() {
 return { data: [] };
 },
 
 render: function() {
 return (
  <div>以前的方式创建的组件</div>
 );
 }
});
export default MyComponent;

React.Component(ES6)

import React,{ Component } from 'react';
class MyComponent extends Component {
 constructor(props) {
 super(props);
 this.state = { data: [] };
 }
 
 render() {
 return (
  <div>ES6方式创建的组件</div>
 );
 }
}
export default MyComponent;

四、this

. 使用ES6 class语法创建组件, class中的方法不会自动将this绑定到实例中。必须使用 .bind(this)或者 箭头函数 =>来进行手动绑定。

React.createClass

import React from 'react';
const MyComponent = React.createClass({
 handleClick: function() {
 console.log(this);
 },
 render: function() {
 return (
  <div onClick={this.handleClick}>以前的方式创建的组件</div>
 );
 }
});
export default MyComponent;

React.Component(ES6)

import React,{ Component } from 'react';
class MyComponent extends Component {
 handleClick() {
 console.log(this);
 }
 
 render() {
 return (
  <div onClick={this.handleClick.bind(this)}>ES6方式创建的组件</div>
 );
 }
}
export default MyComponent;

也可以将绑定方法写到constructor中:

import React,{ Component } from 'react';
class MyComponent extends Component {
 constructor(props) {
 super(props);
 this.handleClick = this.handleClick.bind(this);
 }
 handleClick() {
 console.log(this);
 }
 
 render() {
 return (
  <div onClick={this.handleClick}>ES6方式创建的组件</div>
 );
 }
}
export default MyComponent;

或者使用箭头函数 => :

import React,{ Component } from 'react';
class MyComponent extends Component {
 handleClick = () => {
 console.log(this);
 }
 
 render() {
 return (
  <div onClick={this.handleClick}>ES6方式创建的组件</div>
 );
 }
}
export default MyComponent;

五、Mixins

. 使用ES6语法来创建组件是不支持React mixins的,如果一定要使用React mixins就只能使用React.createClass方法来创建组件了。

import React,{ Component } from 'react';
var SetIntervalMixin = {
 doSomething: function() {
 console.log('do somethis...');
 },
};
const Contacts = React.createClass({
 mixins: [SetIntervalMixin],
 
 handleClick() {
 this.doSomething(); //使用mixin
 },
 render() {
 return (
  <div onClick={this.handleClick}></div>
 );
 }
});
export default Contacts;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
JavaScript 闭包深入理解(closure)
May 27 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
Sep 21 Javascript
使用jquery动态加载javascript以减少服务器压力
Oct 29 Javascript
node.js中格式化数字增加千位符的几种方法
Jul 03 Javascript
JavaScript截断字符串的方法
Jul 15 Javascript
JS拖拽插件实现步骤
Aug 03 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
Dec 18 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
Feb 13 Javascript
JavaScript贪吃蛇小组件实例代码
Aug 20 Javascript
Vue2.0实现简单分页及跳转效果
Jul 29 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
Nov 15 Javascript
toString.call()通用的判断数据类型方法示例
Aug 28 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
Mar 02 #Javascript
JavaScript表单验证完美代码
Mar 02 #Javascript
js实现常见的工具条效果
Mar 02 #Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
Mar 02 #Javascript
jQuery给表格添加分页效果
Mar 02 #Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
Mar 02 #Javascript
Bootstrap Scrollspy源码学习
Mar 02 #Javascript
You might like
PHP图片上传类带图片显示
2006/11/25 PHP
PHP与SQL注入攻击[二]
2007/04/17 PHP
php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
2010/03/23 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
2010/10/12 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
2017/05/08 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
详解使用Vue Router导航钩子与Vuex来实现后退状态保存
2017/09/11 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
Python正则表达式常用函数总结
2017/06/24 Python
Python中Threading用法详解
2017/12/27 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
PyTorch里面的torch.nn.Parameter()详解
2020/01/03 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
实习单位鉴定评语
2014/04/26 职场文书
交通事故被告答辩状
2015/05/22 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python