使用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读取XML文件数据并显示的实现代码
Dec 16 Javascript
jQuery ul标签下拉菜单演示代码
Dec 11 Javascript
javaScript 计算两个日期的天数相差(示例代码)
Dec 27 Javascript
jQuery的cookie插件实现保存用户登陆信息
Apr 15 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
Mar 04 Javascript
jQuery实现当前页面标签高亮显示的方法
Mar 10 Javascript
javaScript实现可缩放的显示区效果代码
Oct 26 Javascript
AngularJS入门教程之AngularJS表达式
Apr 18 Javascript
React Native中NavigatorIOS组件的简单使用详解
Jan 27 Javascript
webpack组织模块打包Library的原理及实现
Mar 10 Javascript
vue中设置、获取、删除cookie的方法
Sep 21 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
Dec 23 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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
php方法调用模式与函数调用模式简例
2011/09/20 PHP
php 注释规范
2012/03/29 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
Node.js简单入门前传
2017/08/21 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
Python中使用摄像头实现简单的延时摄影技术
2015/03/27 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
python在地图上画比例的实例详解
2020/11/13 Python
教堂婚礼主持词
2014/03/14 职场文书
化妆品活动策划方案
2014/05/23 职场文书
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
Python3 类型标注支持操作
2021/06/02 Python