使用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的滚动条滚动固定div(附演示下载)
Oct 29 Javascript
关于删除时的提示处理(确定删除吗)
Nov 03 Javascript
javascript常见用法总结
May 22 Javascript
基于JavaScript实现智能右键菜单
Mar 02 Javascript
JS中改变this指向的方法(call和apply、bind)
Mar 26 Javascript
Three.js快速入门教程
Sep 09 Javascript
javascript输出AscII码扩展集中的字符方法
Dec 26 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
Sep 18 Javascript
AngularJs 终极购物车(实例讲解)
Nov 08 Javascript
浅谈React 服务器端渲染的使用
May 08 Javascript
Vuex mutitons和actions初使用详解
Mar 04 Javascript
layui实现数据分页功能(ajax异步)
Jul 27 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
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
解析PHP无限级分类方法及代码
2013/06/21 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
JQuery onload、ready概念介绍及使用方法
2013/04/27 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
nodejs中模块定义实例详解
2017/03/18 NodeJs
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
2017/07/20 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
详解ES7 Decorator 入门解析
2019/02/18 Javascript
用webAPI实现图片放大镜效果
2020/11/23 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
在Python中使用元类的教程
2015/04/28 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
Python使用python-docx读写word文档
2019/08/26 Python
详解python中各种文件打开模式
2020/01/19 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
物流管理毕业生自荐信
2013/10/24 职场文书
男女朋友协议书
2014/04/23 职场文书
小学教师培训方案
2014/06/09 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
大学生学年个人总结
2015/02/15 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
老兵退伍感言
2015/08/03 职场文书
nginx设置资源请求目录的方式详解
2022/05/30 Servers