React Higher-Order Component (HOC) for observing and invoking axios
requests.
Features:
- can rerender component when request status changes
- can abort requests when unmounting component
- can abort request on second call
npm i react-axios-hoc
import React, { Component, Fragment } from 'react'
import PropTypes from 'prop-types'
import axios from 'axios'
import withActions from 'react-axios-hoc'
class Dog extends Component {
static propTypes = {
fetchDogAction: PropTypes.object.isRequired,
}
handleClick = () => {
const { fetchDogAction } = this.props
fetchDogAction.run()
}
render() {
const { fetchDogAction } = this.props
const { isPending, isFailed, isSucceded, error, result } = fetchDogAction
return (
<Fragment>
<button onClick={this.handleClick}>
Random Dog
</button>
{ isPending && (
<div>
Loading...
</div>
) }
{ isFailed && (
<div>
{ error.message }
</div>
) }
{ isSucceded && (
<div>
<img src={result.data.message} />
</div>
) }
</Fragment>
)
}
}
const mapActionsToProps = {
fetchDogAction: cancelToken => () => (
axios('https://dog.ceo/api/breeds/image/random', {
cancelToken
})
)
}
export default withActions(mapActionsToProps)(Dog)
...
handleClick = async () => {
const { fetchDogAction } = this.props
try {
const dog = await fetchDogAction.run()
console.log('Fetched dog: ', dog)
}
catch (error) {
console.log('Error occured while fetching a dog: ', error.message)
}
}
...
...
const mapActionsToProps = {
fetchUserAction: cancelToken => id => (
axios(`/users/${id}`, { cancelToken })
)
}
...
fetchUserAction.run({
params: [userId]
})
...
mapActionsToProps = { ... }
- function or object that defines actions. If it's a function then component props will be passed to it.options = { abortPendingOnUnmount: true }
isDefault
-true
if action never ranisPending
-true
if request is pendingisSucceded
-true
if request has succededisFailed
-true
if request has failedresult
- result of requesterror
- error occured while performing requestrun(runOptions)
- starts requestreset(resetOptions)
- resets action (aborts request & resets status)
params = []
- params will be passed to axios actionsilent = false
- disables throwing errorsabortPending = true
- aborts previous request if it's still runningupdateComponent = true
- invokes component rerender on status changeupdateComponentOnPending = true
updateComponentOnSuccess = true
updateComponentOnFailure = true
updateComponent = true
- invokes component rerender