vuex What is it? ?

      Specifically for vue Design of state management architecture , Unified management and maintenance vue Variable state of .

vuex The five core attributes of ?

      Five core concepts :state,getters,actions,mutations,modules

state

    state yes vuex Basic data of

    because vuex State storage is responsive , therefore vue Component from store The easiest way to get the state in is to write it in a calculated property

    By registering in the root instance  store  option , The store Instances are injected into all the child components under the root component , And the sub components can pass through the  this.$store  Visit to
const Counter = { template: `<div>{{ count }}</div>`, computed: { count () {
return this.$store.state.count } } }
mapState auxiliary function

When a component needs to obtain multiple states , Declaring these states as computed properties is a bit of a duplication and redundancy . In order to solve this problem , We can use it mapState
Auxiliary functions help us generate computational properties , Let you press the key a few times less .
// In the separately built version, the auxiliary function is Vuex.mapState import { mapState } from 'vuex' export default
{ // ... computed: mapState({ // Arrow functions make the code more concise count: state => state.count, //
Pass string parameter 'count' Equivalent to `state => state.count` countAlias: 'count', // In order to be able to use `this`
Get local state , Regular functions must be used countPlusLocalState (state) { return state.count +
this.localCount } }) } // Using object expanders ...mapState({ topNav: state =>
state.topNav.data, // take this.topNav Map to this.$store.topNav.data navigationInfo:
state => state.topNav.navigationInfo }),
Getters

        Vuex Allow us to be here store Defined in “getter”( It can be said that store Calculation properties of ). It's like calculating properties ,getter
The return value of is cached according to its dependency , And it is recalculated only when its dependency value changes .

       getters receive state As its first parameter , Accept others getters As the second parameter , If not required , The second parameter can be omitted in the following example :
const store = new Vuex.Store({ state: { count:0 }, getters: { // Single parameter
countDouble: function(state){ return state.count * 2 }, // Two parameters
countDoubleAndDouble: function(state, getters) { return getters.countDouble * 2
} } })
Access through properties

Getter Will be exposed as  store.getters  object , You can access these values in the form of properties :
store.getters.doneTodos // -> [{ id: 1, text: '...', done: true }]
Access by method
getters: { // ... getTodoById: (state) => (id) => { return
state.todos.find(todo => todo.id === id) } } // Access by method
store.getters.getTodoById(2) // -> { id: 2, text: '...', done: false }
mapGetters  The auxiliary function is simply to store In getter Map to local computed properties :
import { mapGetters } from 'vuex' export default { // ... computed: { //
Use the object expansion operator to expand the getter Mix in computed Object ...mapGetters([ 'doneTodosCount',
'anotherGetter', // ... ]) } } mapGetters({ // hold `this.doneCount` Map to
`this.$store.getters.doneTodosCount` doneCount: 'doneTodosCount' })
Mutation

  change Vuex Of store The only way to change the state of is to commit mutation.

mutation It has to be synchronous , If you want to be asynchronous, you need to use action.

each mutation Has a string Event type (type) and One Callback function
(handler). This callback function is where we actually make the state change , And it will accept it state
As the first parameter , Submit the load as the second parameter .( The submitted load should be an object in most cases ), Submitted loads may also be omitted .
const store = new Vuex.Store({ state: { count: 1 }, mutations: { // No load submitted
increment(state) { state.count++ } // Submit load incrementN(state, obj) { state.count
+= obj.n } } }) // Call in component // No load submitted store.commit('increment') // Submit load
store.commit('incrementN', { n: 100 })
mapMutations auxiliary function
import { mapMutations } from 'vuex' export default { //.. methods: {
...mapMutations([ 'increment' // mapping this.increment() by
this.$store.commit('increment') ]), ...mapMutations({ add: 'increment' // mapping
this.add() by this.$store.commit('increment') }) } }
Action

Action be similar to mutation, The difference is that :

* Action Submitted mutation, Instead of changing state directly .
* Action Can contain any asynchronous operation . const store = new Vuex.Store({ state: { count: 0 },
mutations: { increment (state) { state.count++ } }, actions: { increment
(context) { context.commit('increment') } } })
be careful :Action Function accepts an and store Instances with the same methods and properties context object , So you can call context.commit Submit a
mutation, Or by context.state and context.getters To get state and getters.

       Action adopt  store.dispatch  Method trigger :
store.dispatch('increment')
mapActions auxiliary function

You use it in components  this.$store.dispatch('xxx')  distribute action, Or use  mapActions  The auxiliary function will change the methods
Map to  store.dispatch  call ( It needs to be injected at the root node first  store):
import { mapActions } from 'vuex' export default { //.. methods: {
...mapActions([ 'incrementN' // mapping this.incrementN() by
this.$store.dispatch('incrementN') ]), ...mapActions({ add: 'incrementN' // mapping
this.add() by this.$store.dispatch('incrementN') }) } }
Module 

Using a single state tree , It causes all the states of the application to concentrate on a large object . however , When the application gets big ,store The object will become bloated .

In order to solve the above problems ,Vuex Allow us to store Split into modules (module). Each module has its own
state,mutation,action,getters, Even nested submodules —— A similar segmentation is performed from top to bottom : 
import Vuex from 'vuex'; import topNav_store from "./topNav/store.js"; import
member_store from "./member/store.js"; import game_store from
"./coupon/game.js"; import approval from './approval/store.js' import
setRentInfo from './contract/store.js' export default new Vuex.Store({
modules:{ topNav:topNav_store, memberStore:member_store, game_store:game_store,
approval:approval, setRentInfo } })

Technology