vuex-async-module
Reduce async boilerplate code generating Vuex modules. Compatible with Vue 2.x
Installation
npm install @liqueflies/vuex-async-module --save
yarn add @liqueflies/vuex-async-module
Introduction
vuex-async-module
generates Vuex Modules reducing boilerplate for asynchronous request, inspired by this post of Lachlan Miller.
Behind the idea
The workflow for a successful asynchronous request should be like:
state = {
isPending: true
statusCode: null,
data: null,
errors: null
}
state = {
isPending: false,
statusCode: 200,
data: {...},
errors: null
}
Standard Vuex code should write also types
, actions
, mutations
, and getters
for each async action.
We can notice that in many cases we will write the same code over and over again.
vuex-async-module
will scaffold this code for you.
Basic usage
import getAsyncModule from '@liqueflies/vuex-async-module'
export default new Vuex.Store({
state,
actions,
getters,
mutations,
modules: {
movies: getAsyncModule({ xhr: axios.get })
}
})
and then in your .vue
import { asyncModuleMixin } from '@liqueflies/vuex-async-module'
export default {
name: 'movies',
mixins: [asyncModuleMixin],
beforeMount () {
this.getAsyncMovies({ url: 'https://ghibliapi.herokuapp.com/films' })
}
}
and in the template
<div v-if="moviesRequestIsPending" />
<ul v-else>
<li v-for="movie in movies" :key="movie.id">
<h2> {{ movie.title }} - {{ movie.release_date }} </h2>
</li>
</ul>
Documentation
vuex-async-module
has only one constrain: component
name must be the same of module
name.
vuex-async-module
mixin adds two computed
properties:
- [
componentName
]RequestIsPending - i.e moviesRequestIsPending
- [
componentName
] - i.e. movies
and a method
- getAsync[
componentName
] i.e. getAsyncMovies
getAsync
expects to receive the url for the ajax call, and a boolean parameter to force the update of the previous fetched data.
And the job is done!
Contributors
Thanks to Marco Solazzi and Giovanni Rodighiero.
License
MIT
Copyright (c) 2017 Lorenzo Girardi