我想创建一个像 react-router 这样的 HOC,它为组件提供一些与上下文相关的数据。上下文数据需要从服务器获取。
import React, { Component } from "react";
export function withSearchContext(ComponentToWrap) {
return class extends Component {
//should actually come from server
state = {
searchContext: {
key: "adedd34ddDdd1"
}
};
componentDidMount() {
this.getContextFromServer();
}
getContextFromServer() {
this.props.getContextFromServer().then(response => {
this.setState({searchContext: response.data});
});
}
render() {
return (
<ComponentToWrap {...this.props} searchContext={this.state.searchContext} />
);
}
};
}
我正在使用它
import React, { Component } from 'react';
import { withSearchContext } from '../../Context';
@withSearchContext
class AccountDetail extends Component<{}, {}> {
componentDidMount = () => {
console.log(this.props.searchContext);
};
render() {
if(this.props.searchContext.key){
return (
<div className="detail-view flex-container">
{this.props.searchContext.key}
</div>
}
return <div> Loading ... </div>;
);
}
}
问题是我包装它的每个组件都会调用 HOC。因此,对服务器的调用会发生多次。但是,我只需要 HOC 运行一次并向使用 HOC 的任何组件提供上下文。如何在 React 中实现这一点?