javascript - 在 react redux 中从 HOC 创建多个请求
问题描述
我想从 hoc 创建多个请求,我可以为单个请求创建 hoc(调用 api 的 redux 操作),请检查单个请求的代码
我已经创建了 hoc 以减少每个组件中的重复代码,例如componentdidmount
调用 api、管理错误、管理加载状态,但它仅适用于单个请求,就像您可以在给定 hoc 的初始对象中看到的那样,所以我想要创建一个可以执行多个请求(调用 api 的 redux 操作),我不知道这个适用于单个请求的解决方案是否正确实施
所以,请帮助我创建可以在任何给定场景下重新密封的 hoc
特设的
export const ComponentWithAPIRequest = ({ onMount = null, LoaderRequestID,onUnmount = null }) => (WrappedComponent) => {
return class ComponentWithAPIRequest extends Component {
state = {
stateLoader: true // intial Load
};
componentDidMount = () => {
this.Request();
};
componentWillUnmount() {
onUnmount !== null ? this.props[onUnmount]() : null;
}
Request = () => {
onMount !== null ? this.props[onMount](LoaderRequestID) : null; // API request
this.setState({ stateLoader: false });
};
render() {
const { error, isLoading } = this.props; // pass it here somehow.
const { stateLoader } = this.state;
const isLoadingFromAPI = this.props.isLoadingRequestIds.indexOf(LoaderRequestID) !== -1 ? true : false;
if (stateLoader) {
return (
<div className="text-center">
<CircularProgress />
</div>
);
}
if (isLoadingFromAPI) {
return (
<div className="text-center">
<CircularProgress />
</div>
);
} else {
return <WrappedComponent {...this.props} retry={this.Request} />;
}
}
};
};
零件
export const isContainer = ({ intial, list }) => (WrappedComponent) => {
const IsContainer = (props) => <WrappedComponent {...props} />;
return compose(ComponentWithAPIRequest(intial), hasRequestError)
(IsContainer);
};
hasRequestError // is error hoc
ComponentWithAPIRequest // is above added hoc
@isContainer({
intial: {
onMount: 'FirstRequest', // is a redux action which call api,here i want to have multiple request like ['FirstRequest','SecondRequest']
LoaderRequestID: 'FirstRequestLoader', // is an unique id for loader,which then for multiple request be converted to respective request like ['FirstRequestLoader','SecondRequestLoader']
onUnmount: 'ResetLeaderBoardAll' // is a redux action when component unmount
}
})
class ComponentView extends Component {
render() {
return (
<SomeComponent {...this.props}/>
);
}
}
const mapStateToProps = (state) => {
return {
somestate:state
};
};
export default connect(mapStateToProps, {
FirstRequest,
SecondRequest
})(ComponentView);
解决方案
如果我是你,我会更新你的 hoc 并传递多个 URL 作为参数来发送多个请求,例如:
export default connect(mapStateToProps, mapDispatchToProps)(ComponentWithAPIRequest(ComponentView,
[
"url1", "url2" ...
]));
并使用“props”或“props.requestResponses”(单个)对象将它们传递回 ComponentView。然后我会像使用它们一样
const url1response = this.props.requestResponses["url1"];
就我而言,我会将它们存储在 ComponentWithAPIRequest 的状态中,但您也可以使用 redux 并从 ComponentView 中的 mapStateToProps 获取它们。
推荐阅读
- java - 创建永久 JUnit 配置的任何方式。在 IntelliJ 上?
- angular - 角度输入值无法更新
- reactjs - 做出反应。为什么我不能从第三方库中插入组件?
- python - 如何在 PyQt5 中添加名为堆栈页面的动态对象?
- python - 有什么方法可以在 python 中生成这样的随机表吗?
- python - Python:从具有类别变量列的一个类别的数据框中创建单独的数据框
- javascript - 如何在react js中使用redux在react js中映射来自api的数组响应?
- sql - 如何在 SQL 中以 0 开头?(例如 1 => 01)
- python - 将 AWS S3 存储桶与 Django 结合使用时出现 TypeError
- ios - 归档时出现“没有这样的模块‘翠鸟’”错误