利用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弹窗代码 可以指定弹出间隔
Jul 03 Javascript
js对象之JS入门之Array对象操作小结
Jan 09 Javascript
页面图片浮动左右滑动效果的简单实现案例
Feb 10 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
Jun 20 Javascript
jQuery纵向导航菜单效果实现方法
Dec 19 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
Jun 13 Javascript
详解vue-router2.0动态路由获取参数
Jun 14 Javascript
js中el表达式的使用和非空判断方法
Mar 28 Javascript
vue实现自定义多选与单选的答题功能
Jul 05 Javascript
150行代码带你实现微信小程序中的数据侦听
May 17 Javascript
简述ES6新增关键字let与var的区别
Aug 23 Javascript
Vue-Cli项目优化操作的实现
Oct 27 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
php中大括号作用介绍
2012/03/22 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
php无限极分类实现方法分析
2019/07/04 PHP
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
js中判断控件是否存在
2010/08/25 Javascript
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
微信小程序tabBar设置实例解析
2019/11/14 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
跟老齐学Python之类的细节
2014/10/13 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
详解python3实现的web端json通信协议
2016/12/29 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
2020/07/23 Python
清除canvas画布内容(点擦除+线擦除)
2020/08/12 HTML / CSS
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
StringBuilder和String的区别
2015/05/18 面试题
广告设计专业自荐信范文
2013/11/14 职场文书
生产内勤岗位职责
2013/12/07 职场文书
求职信范文英文版
2014/01/05 职场文书
平安建设实施方案
2014/03/19 职场文书
中等生评语大全
2014/05/04 职场文书
公司授权委托书范文
2014/08/02 职场文书
2014年加油站工作总结
2014/12/04 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
5道关于python基础 while循环练习题
2021/11/27 Python