使用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函数以及基础写法100多条实用整理
Jan 13 Javascript
js清空form表单中的内容示例
May 20 Javascript
javascript实现多级联动下拉菜单的方法
Feb 06 Javascript
介绍JavaScript中Math.abs()方法的使用
Jun 14 Javascript
纯js模仿windows系统日历
Feb 04 Javascript
jquery dataTable 后台加载数据并分页实例代码
Jun 07 jQuery
详解关于html,css,js三者的加载顺序问题
Apr 10 Javascript
解决layui动态添加的元素click等事件触发不了的问题
Sep 20 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
Nov 14 Javascript
vue iview实现动态新增和删除
Jun 17 Javascript
JavaScript对象访问器Getter及Setter原理解析
Dec 08 Javascript
Vue 修改网站图标的方法
Dec 31 Vue.js
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
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
php文件缓存方法总结
2016/03/16 PHP
php 数据结构之链表队列
2017/10/17 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
javascript中window.event事件用法详解
2012/12/11 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
vue项目每30秒刷新1次接口的实现方法
2018/12/04 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
简单的Python抓taobao图片爬虫
2014/10/26 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
使用python实现个性化词云的方法
2017/06/16 Python
Apache部署Django项目图文详解
2019/07/30 Python
python数据化运营的重要意义
2019/11/25 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
浅析Python面向对象编程
2020/07/10 Python
乐天旅游台湾网站:Rakuten Travel TW
2017/06/01 全球购物
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
社团活动策划书范文
2014/01/09 职场文书
前台文员我鉴定
2014/01/12 职场文书
汽车广告策划方案
2014/05/31 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
出纳工作检讨书
2014/10/18 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书