利用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跨域刷新实现代码
Jan 01 Javascript
获取客户端电脑日期时间js代码(jquery)
Sep 12 Javascript
Js base64 加密解密介绍
Oct 11 Javascript
JavaScript中常用的六种互动方法示例
Mar 13 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
Aug 13 Javascript
ReactJs设置css样式的方法
Jun 08 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
Sep 30 Javascript
详解Vue实战指南之依赖注入(provide/inject)
Nov 13 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
Sep 03 Javascript
在layui中select更改后生效的方法
Sep 05 Javascript
vue路由守卫,限制前端页面访问权限的例子
Nov 11 Javascript
jQuery插件实现图片轮播效果
Oct 19 jQuery
深入理解在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
URL Rewrite的设置方法
2007/01/02 PHP
php下实现农历日历的代码
2007/03/07 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
2016/04/12 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
React数据传递之组件内部通信的方法
2017/12/31 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
使用electron制作满屏心特效的示例代码
2018/11/27 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
2020/12/03 Javascript
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
详解python中sort排序使用
2019/03/23 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
python中enumerate() 与zip()函数的使用比较实例分析
2019/09/03 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
放飞中国梦演讲稿
2014/04/23 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
二年级学生期末评语
2014/12/26 职场文书
整脏治乱工作简报
2015/07/21 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python