Vuex

任何回调函数中进行的状态改变都是无法追踪的

Vuex

状态管理(重点) vuex 需要独立安装,用来解决数据存储和维护的问题

使用:

1.npm i vuex -S

2.store.js

import Vue from 'vue';

import Vuex from 'vuex';

Vue.use(Vuex);

let store=new Vuex.Store({

    state:{

        item:[1,2,3]

    },

    getters:{},

    mutations:{},

    actions:{}

})

export default store;

3.main.js

import store from './store/store.js';

new Vue({

  store,

  router,

  render: h => h(App),

}).$mount('#app')

属性:

- state  用来存储状态的容器

state:{

        item:[1,2,3]

    }

- mutations  用来存储改变state的方法的容器

mutations:{

        setNum(state,payload){

            state.item.push(payload)

        }

    }

- actions  用来存储异步代码和业务逻辑代码,组件页用户触发的是这个函数

actions:{

        setNum(context,payload){

            context.commit("setNum",payload);

        }

    }

- getters  类似计算属性

getters:{

        show(state){

            return state.item;

        }

    }

- modules  状态特别多时,可以用modules将状态进行分类

this.$store.state.g.goods  //g模块下的goods

store.js

import .......

import cart from './cart.js'

const store = new Vuex.Store(

      {

        modules: {

            adress,

            cart

        }

    })

export default store

cart.js

const cart={

namespaced:true, //使用命名空间

state={},

getters:{},

...

}

export...

组件触发:

methods:{

  add(){

this.$store.dispatch("a/setNum",parseInt(Math.random()*3)) //a模块下的setNum

    this.$store.dispatch("setNum",parseInt(Math.random()*3)) //所有模块的setNum

  }

}

订阅事件:

store.subscribe((mutation, state)=>{

    // 每次执行完 mutation 后,该订阅函数会被自动触发

})

区分 actions 和 mutations 并不是为了解决竞态问题,而是为了能用 devtools 追踪状态变化

mutation 必须是同步,意义在于这样每一个 mutation 执行完成后都可以对应到一个新的状态(和 reducer 一样).

亲测: 如果在mutation中做了异步操作,在dev-tools中会立即打印一个snapshot,而此时异步操作还没有执行完,此时的snapshot的信息是错误的。

而在action中做异步操作dev-tools会等等异步操作执行完才去打印mutation的一个snapshot,这样便于我们回查time-travel,查看在某个mutation里的变化。

辅助函数的使用:

import {mapState,mapMutations,mapActions,mapGetters} from "vuex"

state的辅助函数需要映射到计算属性中computed,映射的名称一定要相同,然后就可以通过this访问到state

  computed:{

    //  ...mapState(["item"]) //name和vuex中的state保持一至。

...mapState({ //用了模块化后

    item:(state,getters)=>{

                return state.cang.item;

            }

  })

    },

methods:{

  click(){

    console.log(this.name)//访问到vuex的name

  }

}

mutation的辅助函数mapMutations把mutations里面的方法映射到methods中

methods:{

    //  ...mapMutations(["show"])

  ...mapGetters({ //用了命名空间后

    "show":"cang/show"

  }),

        click(){

            this.show()

        },

}

mapAcions:把actions里面的方法映射到methods中

methods:{

// ...mapActions(['setNum'])

...mapActions({ //用了命名空间后

    setNum:"cang/setNum"

  })

}

mapGetters:把getters属性映射到computed身上

你可能感兴趣的:(Vuex)