使用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 相关文章推荐
JavaScript几种形式的树结构菜单
May 10 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
全面理解面向对象的 JavaScript(来自ibm)
Nov 10 Javascript
JS保存和删除cookie操作 判断cookie是否存在
Nov 13 Javascript
使用js解决由border属性引起的div宽度问题
Nov 26 Javascript
jquery zTree异步加载简单实例讲解
Feb 25 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
May 25 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
Feb 27 Javascript
灵活使用console让js调试更简单的方法步骤
Apr 23 Javascript
JS获取动态添加元素的方法详解
Jul 31 Javascript
解决webpack多页面内存溢出的方法示例
Oct 08 Javascript
详解JavaScript 高阶函数
Sep 14 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
php面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
Python数据库的连接实现方法与注意事项
2016/02/27 Python
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
python requests 测试代理ip是否生效
2018/07/25 Python
使用pytorch和torchtext进行文本分类的实例
2020/01/08 Python
如何在django中运行scrapy框架
2020/04/22 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
linux系统都有哪些运行级别
2012/04/15 面试题
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
建筑公司文秘岗位职责
2013/11/29 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
学校运动会报道稿
2014/09/23 职场文书
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS
python中validators库的使用方法详解
2022/09/23 Python