我想用 axios 处理程序制作 HOC,所以我不需要处理来自响应的所有可能的反馈(404,200,401,响应等)
这是我的withFetchingAxios
:
export default (Component)=> class extends React.PureComponent{
constructor(props) {
super(props);
this.state = {
response:null,
error:'',
isLoading:false
};
this.makeRequest = this.makeRequest.bind(this);
}
async makeRequest({method='get', url, data=null, config=null}){
console.log(method , url, data, config)
try {
this.setState({isLoading:true})
AxiosInstance[method](url, JSON.parse(config), JSON.parse(data))
.then((res) => {
this.setState({response:res.data})
})
.catch((err) => {
this.setState({error:err})
})
.finally(() => {
this.setState({isLoading:false})
});
} catch (err) {
console.log('err withFetchingAxios' , err)
this.setState({error:err, isLoading:false})
}
}
render(){
if(this.state.isLoading){
return(
//show loader component
)
} // else if error show component error,
return(
<Component
{...this.props}
response={this.state.response}
makeRequest={({method='get', url, data, config})=>this.makeRequest({method, url, data, config})}
/>
)
}
}
我只是在我的其他组件中使用它,例如Home
:
export default withFetchingAxios(class Home extends React.Component{
/**
* List function to handling component
*/
componentDidMount(){
this.props.makeRequest({url:'posts'})
}
/**
* List function to render component
*/
/**
* End list function to render component
*/
render() {
return(
//Home UI
)
}
})
但我从HOCconsole.log
的函数中得到了无限循环,async makeRequest()
我如何避免它,只让 HOC 调用makeRequest()
一次?
我需要处理 HOC 才能获得ability
类似:
axios
如果方法是,则在 didmount 时调用 HOCget
onPress
如果方法是,则从事件调用 HOCpost