React与ES6(四)ES6如何处理React mixins
React与ES6系列:
- React与ES6(一)开篇介绍
- React和ES6(二)ES6的类和ES7的property initializer
- React与ES6(三)ES6类和方法绑定
- React与ES6(四)ES6如何处理React mixins
在使用React.createClass()
的时候你也许使用过一个所谓的mixin
的东西。使用它,你可以给React组件天剑很多其他的功能。这个概念不止用在React上,也用在很多其他的编程语言或者框架上。
在ES6中不能够在使用React的mixin机制。本文不会纠结于原因为何。我们只关注ES6中的替代方法。
High-Order Component
或者可以叫做高阶组件。
我们使用前文中使用的CartItem
组件作为例子,在其中显示一个每秒计数增加1的timer。
为了更好的演示,我们不修改CartItem
的代码。相反的我们要提供一些组件,这些组件会封装CartItem
并且给CartItem
增强一些另外的方法。这样的一个组件就叫做High-Order Comoentn
。
上面的介绍可能还是有些模糊,不要紧随着本文步步深入一切都会变得清晰。
我们假设这个Hight-Order Component叫做IntervalEnhance
,存放在一个叫做intervalEnhance.jsx的文件中。那么我们的CartItem
应该怎么改呢?
import React from 'react';
// 1
import {IntervalEnhance} from './IntervalEnhance';
class CartItem extends React.Component {
//...略...
}
//2
export default IntervalEnhance(CartItem);
解释:
- 引入高阶组件
IntervalEnhance
。 - export高阶组件包装增强后的
CartItem
。
下满就看看告诫组件是怎么定义的:
//@flow
import React from 'react';
//1
export var IntervalEnhance = ComposeComponent => class extends ComposeComponent {
// 2
static displayName = 'ComponentEnhancedWithIntervalHOC';
constructor(props) {
super(props);
this.state = {
seconds: 0
};
}
// 3
componentDidMount() {
this.interval = setInterval(this.tick.bind(this), 1000);
}
// 3
componentWillUnmount() {
clearInterval(this.interval);
}
tick() {
this.setState({
seconds: this.state.seconds + 1000
});
}
render() {
return (
// 4
<ComposeComponent {...this.props} {...this.state} />
);
}
}
解释:
ComposeComponent => class extends React.Comonent
这句。还记得箭头函数吗?没错,这就是一个箭头函数。这个函数接受一个组件为输入参数,返回一个类。ComposedComponent
就是输入参数,也就是需要包装增强的组件。export var IntervalEnhance
就是把前面定义的函数命名为IntervalEnhance
export出去给其他的模块使用。- displayName设定为
ComponentEnhancedWithIntervalHOC
是为了在DevTools中方便调试。在DevTools里这个组件就会被叫做ComponentEnhancedWithIntervalHOC
。 - 组件生命周期不同阶段的回调。是React组件的内置方法。
- 最有意思的就是这里了。这样的写法会把当前高阶组件的全部props和state都发送给
CartItem
,这样CartItem
就可以取到this.state.seconds
属性的值了。
最后我们就需要修改CartItem
组件的内部了。这样才能输出this.state.seconds
的值。
import React from 'react';
import {IntervalEnhance} from './IntervalEnhance';
class CartItem extends React.Component {
render() {
return (
<article className="row large-4">
<p className="large-12 column" >
<strong>Time elapsed for interval: </strong>
{this.props.seconds} ms
</p>
</article>
);
}
}
注意:全部都完成都不需要修改CartItem
组件本身(除了render
方法)!这就是为什么High-Order Component为什么这里厉害的原因所在。
使用ES7装饰器
使用ES7的装饰器(decorator)代码会更加简洁。
首先,安装babel-plugin-transform-decorators-legacy
:
npm install --save-dev babel-plugin-transform-decorators-legacy
之后,配置.babelrc文件:
{
"presets": ["es2015", "react", "stage-0"],
"plugins": [
["transform-decorators-legacy"]
]
}
然后:
import React from 'react';
import {IntervalEnhance} from './intervalEnhance';
@IntervalEnhance
class CartItem extends React.Component {
// ...略...
}
总结
Hight-Order Component(高阶组件)非常好用,也可以非常有效的解决问题。当前,使用高阶组件非常多的用来代替旧的mixin。
有一个典型的例子就是Relay。Relay也是facebook发布的一个完全基于React的framework。你的每一个组件都可以包裹在Relay容器中,自动的存取依赖的数据。
React与ES6(四)ES6如何处理React mixins的更多相关文章
- React Native 的ES5 ES6写法对照表
模块 引用 在ES5里,如果使用CommonJS标准,引入React包基本通过require进行,代码类似这样: //ES5 var React = require("react" ...
- React/React Native 的ES5 ES6写法对照表
//es6与es5的区别很多React/React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component ...
- React/React Native 的ES5 ES6写法对照表-b
很多React/React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component),然而网上搜到的很多教 ...
- React Native中常用ES6语法
一:模块导入导出 //ES6 import React, { Component, PropTypes, } from 'react'; import { Image, Text } from 're ...
- 【转】React Native中ES5 ES6写法对照
很多React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component),然而网上搜到的很多教程和例子都是 ...
- React Native之ES5/ES6语法差异对照表
很多React/React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component),然而网上搜到的很多教 ...
- Web 开发的未来:React、Falcor 和 ES6
Web 开发的未来:React.Falcor 和 ES6 Widen是一家数字资产管理解决方案提供商.目前,其技术栈还非常传统,包括服务器端的Java.浏览器端的AngularJS.提供REST AP ...
- 第四章 模块化React和Redux应用
第四章 模块化React和Redux应用 4.1 模块化应用要点 构建一个应用的基础: 代码文件的组织结构: 确定模块的边界: Store的状态树设计. 4.2 代码文件的组织方式 4.2.1 按角色 ...
- SAAS云平台搭建札记: (四) AntD For React使用react-router-dom路由接收不同参数页面不刷新的问题
在.net开发员眼里,如果使用MVC,根据路由匹配原则,可以通过各种方式接收参数,比如 /Post/List/1, /Post/List/2,或者 /Post/List?id=1,/Post/List ...
随机推荐
- hibernate的延迟加载及其与session关闭的矛盾
延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载. 那么Hibernate是怎么知道用户在什么时候使用数据了呢?又是如何加载数据呢? 其实很简单,它使用了代理机制.返回给用户的并不 ...
- lintcode-【简单题】链表求和
题目: 你有两个用链表代表的整数,其中每个节点包含一个数字.数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头.写出一个函数将两个整数相加,用链表形式返回和. 样例: 给出两个链表 3- ...
- Linux:ssh连接服务器很慢
ssh连接服务器,如果很慢,可以进行如下处理: vi /etc/ssh/sshd_config#UseDNS yes改成:UseDNS no/etc/init.d/sshd restart ----- ...
- Oracle客户端与服务器字符集不统一的处理
当Oracle客户端与服务器的字符集不统一时. 症状: 如:ORA-00283: ?????????? 提示信息中有好多问号. 解决方法: 1查询服务器的字符集: SQL> conn / as ...
- 使用linux的nc来进行文件的传输
NAME nc - arbitrary TCP and UDP connections and listensSYNOPSIS nc [-46DdhklnrStUuvz] [-i interv ...
- TRUNCATE 删除表,无法回退。默认选择为整个表的内容,所以不能加条件。
TRUNCATE 删除表,无法回退.默认选择为整个表的内容,所以不能加条件.DELETE 删除表,可以回退.可以带where 条件.建议使用delete.但是TRUNCATE 删除表数据比delete ...
- IIS7中配置FastCGI运行PHP
环境说明: 操作系统:使用windows 2008 server 64位系统,IIS7.5PHP版本:官方下载PHP 5.4.16 VC9 x86 Non Thread SafeZIP版本.PHP路径 ...
- 数据库中int类型存在空数据开发过程中model和dal层处理方法
model层 public Int32? IsFullAttendance { get; set; } dal层 if (dr["IsFullAttendance"] + &qu ...
- Web前端之html_day1
1.html结构 1 2 3 4 5 6 7 8 9 10 <!DOCTYPE html> <html lang="en"> <head> ...
- Principal Component Analysis(PCA) algorithm summary
Principal Component Analysis(PCA) algorithm summary mean normalization(ensure every feature has sero ...