利用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 控制小数位数的实现代码
Aug 02 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
Jan 06 Javascript
JavaScript函数的4种调用方法详解
Apr 22 Javascript
javascript中Function类型详解
Apr 28 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
Apr 24 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
Feb 08 Javascript
JS抛物线动画实例制作
Feb 24 Javascript
详解Vue单元测试case写法
May 24 Javascript
获取layer.open弹出层的返回值方法
Aug 20 Javascript
使用JS实现导航切换时高亮显示的示例讲解
Aug 22 Javascript
VUE兄弟组件传值操作实例分析
Oct 26 Javascript
JS call()及apply()方法使用实例汇总
Jul 11 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中进行身份认证
2006/10/09 PHP
php 表单数据的获取代码
2009/03/10 PHP
PHP常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
浅析php header 跳转
2013/06/17 PHP
Yii2中简单的场景使用介绍
2017/06/02 PHP
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
IE iframe的onload方法分析小结
2010/01/07 Javascript
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
Vue自定义指令使用方法详解
2017/08/21 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
Python找出最小的K个数实例代码
2018/01/04 Python
使用python模拟命令行终端的示例
2019/08/13 Python
python不同系统中打开方法
2020/06/23 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
详解css3 Transition属性(平滑过渡菜单栏案例)
2017/09/05 HTML / CSS
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
中学实习教师自我鉴定
2013/12/12 职场文书
消防安全员岗位职责
2014/03/10 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
就业协议书样本
2014/08/20 职场文书
离婚协议书怎么写
2014/09/12 职场文书
私营公司诉讼代理委托书范本
2014/09/13 职场文书
房屋登记授权委托书范本
2014/10/09 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2019单位介绍信怎么写
2019/06/24 职场文书
golang使用map实现去除重复数组
2022/04/14 Golang
Golang 并发编程 SingleFlight模式
2022/04/26 Golang
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电