利用ES6语法重构React组件详解


Posted in Javascript onMarch 02, 2017

一、创建组件

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

. 使用React.Component创建组件,需要通过在constructor中调用super()将props传递给React.Component 。另外react 0.13之后props必须是不可变的。

. 由于是用ES6 class语法创建组件,其内部只允许定义方法,而不能定义属性,class的属性只能定义在class之外。所以propTypes要写在组件外部。

. 对于之前的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;

三、状态

. 使用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;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
js 获取服务器控件值的代码
Mar 05 Javascript
javascript创建createXmlHttpRequest对象示例代码
Feb 10 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
May 06 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
Sep 17 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
Nov 03 Javascript
AngularJS监听路由变化的方法
Mar 07 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
Mar 09 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
Jul 09 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
Aug 23 Javascript
JS switch判断 三目运算 while 及 属性操作代码
Sep 03 Javascript
vue结合Echarts实现点击高亮效果的示例
Mar 17 Javascript
微信小程序云开发 搭建一个管理小程序
May 17 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
Mar 02 #Javascript
JavaScript表单验证完美代码
Mar 02 #Javascript
js实现常见的工具条效果
Mar 02 #Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
Mar 02 #Javascript
jQuery给表格添加分页效果
Mar 02 #Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
Mar 02 #Javascript
Bootstrap Scrollspy源码学习
Mar 02 #Javascript
You might like
一些星际专用术语解释
2020/03/04 星际争霸
上传多个文件的PHP脚本
2006/11/26 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
PHP explode()函数用法、切分字符串
2012/10/03 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
js异步加载的三种解决方案
2013/03/04 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
关于Javascript中document.cookie的使用
2017/03/08 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
2017/07/23 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
动态创建类实例代码
2009/10/07 Python
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
Python简单删除目录下文件以及文件夹的方法
2015/05/27 Python
在Mac OS系统上安装Python的Pillow库的教程
2015/11/20 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
Python读写锁实现实现代码解析
2020/11/28 Python
python中pow函数用法及功能说明
2020/12/04 Python
介绍一下Java中标识符的命名规则
2014/02/03 面试题
小学科学教学反思
2014/01/26 职场文书
入党积极分子自我鉴定范文
2014/03/25 职场文书
实习工作表现评语
2014/12/31 职场文书
用人单位聘用意向书
2015/05/11 职场文书