React与ES6(四)ES6如何处理React mixins
React与ES6系列: 在使用 在ES6中不能够在使用React的mixin机制。本文不会纠结于原因为何。我们只关注ES6中的替代方法。 High-Order Component或者可以叫做高阶组件。 我们使用前文中使用的 为了更好的演示,我们不修改 上面的介绍可能还是有些模糊,不要紧随着本文步步深入一切都会变得清晰。 我们假设这个Hight-Order Component叫做 import React from 'react';
// 1
import {IntervalEnhance} from './IntervalEnhance';
class CartItem extends React.Component {
//...略...
}
//2
export default IntervalEnhance(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} />
);
}
}
解释: 最后我们就需要修改 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> ); } }
注意:全部都完成都不需要修改 使用ES7装饰器使用ES7的装饰器(decorator)代码会更加简洁。 首先,安装 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容器中,自动的存取依赖的数据。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |