使用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 相关文章推荐
vs2003 js文件编码问题的解决方法
Mar 20 Javascript
JS字符串函数扩展代码
Sep 13 Javascript
JS实现搜索框文字可删除功能
Dec 28 Javascript
jquery实现静态搜索功能(可输入搜索文字)
Mar 28 jQuery
ztree实现权限横向显示功能
May 20 Javascript
JavaScript实现简单评论功能
Aug 17 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
Sep 21 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
Feb 05 Javascript
vue 权限认证token的实现方法
Jul 17 Javascript
手把手教你使用TypeScript开发Node.js应用
May 06 Javascript
详解JS深拷贝与浅拷贝
Aug 04 Javascript
uniapp实现可以左右滑动导航栏
Oct 21 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
php使用cookie实现记住登录状态
2015/04/27 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
2014/01/26 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
JS数据类型STRING使用实例解析
2019/12/18 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
跟老齐学Python之集成开发环境(IDE)
2014/09/12 Python
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
护士自我鉴定范文
2013/10/06 职场文书
公司门卫的岗位职责
2014/02/19 职场文书
实习证明模板
2015/06/16 职场文书
高三教师工作总结2015
2015/07/21 职场文书
2016中秋节问候语
2015/11/11 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python