利用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 获取span标签中的值的代码 支持ie与firefox
Aug 24 Javascript
JavaScript prototype对象的属性说明
Mar 13 Javascript
Document对象内容集合(比较全)
Sep 06 Javascript
javascript instanceof 内部机制探析
Oct 15 Javascript
Javascript算符的优先级介绍
Mar 20 Javascript
javascript四舍五入函数代码分享(保留后几位)
Dec 10 Javascript
Jquery结合HTML5实现文件上传
Jun 25 Javascript
js for循环倒序输出数组元素的实例
Mar 01 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
Jul 04 Javascript
vue.js项目打包上线的图文教程
Nov 16 Javascript
VUE简单的定时器实时刷新的实现方法
Jan 20 Javascript
浅析JavaScript预编译和暗示全局变量
Sep 03 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静态新闻列表自动生成代码
2007/06/14 PHP
php下MYSQL limit的优化
2008/01/10 PHP
php实现单链表的实例代码
2013/03/22 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
js字符串转成JSON
2013/11/07 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
2017/07/17 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
python pandas模块基础学习详解
2019/07/03 Python
django 微信网页授权登陆的实现
2019/07/30 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
英国著名药妆店:Superdrug
2021/02/13 全球购物
学前教育教师求职自荐信
2013/09/22 职场文书
幼儿园小班家长寄语
2014/04/02 职场文书
体育运动口号
2014/06/09 职场文书
教师节活动总结
2014/08/29 职场文书
辩护词范文大全
2015/05/21 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
Python基础详解之邮件处理
2021/04/28 Python
SQL Server远程连接的设置步骤(图文)
2022/03/23 SQL Server