使用ES6语法重构React代码详解


Posted in Javascript onMay 09, 2017

使用ES6语法重构React组件

在Airbnb React/JSX Style Guide中,推荐使用ES6语法来编写react组件。下面总结一下使用ES6 class语法创建组件和以前使用React.createClass方法来创建组件的不同。

创建组件

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

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

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

3.对于之前的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;

State

使用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;

总结

总的来说使用ES6来创建组件的语法更加简洁,这种语法避免了过多的React样板代码,而更多的使用纯javascript语法,更符合javascript语法习惯。React官方并没有强制性要求使用哪种语法,根据需要合理的选择即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
Mar 23 Javascript
基于jQuery捕获超链接事件进行局部刷新代码
May 10 Javascript
详解JavaScript中数组的相关知识
Jul 29 Javascript
简介BootStrap model弹出框的使用
Apr 27 Javascript
JavaScript实现页面定时刷新(定时器,meta)
Oct 12 Javascript
JS代码实现百度地图 画圆 删除标注
Oct 12 Javascript
jQuery点击导航栏选中更换样式的实现代码
Jan 23 Javascript
js使用highlight.js高亮你的代码
Aug 18 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
Nov 09 Javascript
js canvas实现画图、滤镜效果
Nov 27 Javascript
js实现文字头像的生成代码
Mar 07 Javascript
详解VUE中的插值( Interpolation)语法
Oct 18 Javascript
JQuery实现定时刷新功能代码
May 09 #jQuery
React.js中常用的ES6写法总结(推荐)
May 09 #Javascript
js上传图片预览的实现方法
May 09 #Javascript
react开发中如何使用require.ensure加载es6风格的组件
May 09 #Javascript
Vue2单一事件管理组件通信
May 09 #Javascript
react-router实现按需加载
May 09 #Javascript
BootStrap表单时间选择器详解
May 09 #Javascript
You might like
xml+php动态载入与分页
2006/10/09 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
javascript学习总结之js使用技巧
2015/09/02 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
基于JavaScript实现购物网站商品放大镜效果
2016/09/06 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
Node.js assert断言原理与用法分析
2019/01/04 Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
深入理解Python 代码优化详解
2014/10/27 Python
python try 异常处理(史上最全)
2019/03/07 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
如何真正的了解python装饰器
2020/08/14 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
俄罗斯金苹果网上化妆品和香水商店:Goldapple
2019/12/01 全球购物
C语言笔试题
2014/09/04 面试题
遥感技术与仪器求职信
2014/02/22 职场文书
安全生产承诺书
2014/03/26 职场文书
学生会副主席竞聘书
2014/03/31 职场文书
2014年党的群众路线教育实践活动总结
2014/04/25 职场文书
社团活动总结
2014/04/28 职场文书
学期个人自我总结
2015/02/13 职场文书
教师远程研修感悟
2015/11/18 职场文书
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技