关于react16.4——高阶组件(HOC)
高阶组件是react中用于重用组件逻辑的高级技术。可以说是一种模式。具体来说呢,高阶组件是一个函数,它接收一个组件并返回一个新的组件。
就像这样,
const EnhancedComponent = higherOrderComponent(WrappedComponent);
我们知道,组件将props转为UI,而高阶组件是将一个组件转为另一个组件。组件是React中代码重用的最小单元。然而你会发现某些模式并不能直接适应传统组件。
我们可以写一个函数,能够创建类似于CommentList
和BlogPost
这类订阅DataSource
的新的组件。这个函数接受一个子组件作为参数,这个子组件接受订阅数据源作为props,调用withSubscription
如下,
const CommentListWithSubscription = withSubscription(CommentList,
(DataSource) => DataSource.getComments()
);
const BlogPostWithSubscription = withSubscription(
BlogPost,
(DataSource, props) => DataSource.getBlogPost(props.id)
);
第一个参数是被包含的组件,第二个参数根据给定的DataSource
和当前的props取回我们需要的数据。
当 CommentListWithSubscription
和 CommentListWithSubscription
被渲染时,CommentList
和 BlogPost
将会被传递 data
属性,其中包含从DataSource
取回的最新数据。
// 函数接受一个组件参数……function withSubscription(WrappedComponent, selectData) {
// ……返回另一个新组件……
return class extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.state = {
data: selectData(DataSource, props)
};
}
componentDidMount() {
// ……注意订阅数据……
DataSource.addChangeListener(this.handleChange);
}
componentWillUnmount() {
DataSource.removeChangeListener(this.handleChange);
}
handleChange() {
this.setState({
data: selectData(DataSource, this.props)
});
}
render() {
// ……使用最新的数据渲染组件
// 注意此处将已有的props属性传递给原组件
return <WrappedComponent data={this.state.data} {...this.props} />;
}
};
}
高阶组件既不会修改输入组件,也不会通过继承来复制行为。相反,通过包裹的形式,高阶组件将原先的组件组合在container组件中。高阶组件是纯函数,没有副作用。
在react-router4.0中我们使用的withRouter就是一个高阶组件,以及redux中的connect等。
以上是 关于react16.4——高阶组件(HOC) 的全部内容, 来源链接: utcz.com/z/381693.html