利用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 相关文章推荐
Javascript中暂停功能的实现代码
Mar 04 Javascript
Jquery 获取checkbox的checked问题
Nov 16 Javascript
director.js实现前端路由使用实例
Feb 03 Javascript
jQuery检测返回值的数据类型
Jul 13 Javascript
JavaScript 中有关数组对象的方法(详解)
Aug 15 Javascript
js调用屏幕宽度的简单方法
Nov 14 Javascript
webpack打包非模块化js的方法
Oct 24 Javascript
JS重学系列之聊聊new操作符
Mar 04 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
Sep 05 Javascript
JS控制只能输入数字并且最多允许小数点两位
Nov 24 Javascript
JavaScript实现打砖块游戏
Feb 25 Javascript
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
深入理解在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
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
PHP JWT初识及其简单示例
2018/10/10 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
JS数组方法reduce的用法实例分析
2020/03/03 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
python登录QQ邮箱发信的实现代码
2013/02/10 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
python 实现登录网页的操作方法
2018/05/11 Python
利用Python将数值型特征进行离散化操作的方法
2018/11/06 Python
Python操作json的方法实例分析
2018/12/06 Python
python 下载文件的几种方法汇总
2021/01/06 Python
adidas美国官网:adidas US
2016/09/21 全球购物
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
sealed修饰符是干什么的
2012/10/23 面试题
春节活动策划方案
2014/01/24 职场文书
优秀干部获奖感言
2014/01/31 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
2014年预备党员群众路线教育实践活动对照检查材料思想汇报
2014/10/02 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
同学聚会通知书
2015/04/20 职场文书
Linux磁盘管理方法介绍
2022/06/01 Servers