(1)state

  1. state:{ //存放的键值对就是所要管理的状态
  2. name:'helloVueX'
  3. }
  4. //在组件中调用 $store.state.name

(2)mutations

  1. mutations:{
  2. edit(state,payload){
  3. state.name = 'jack'
  4. console.log(payload) // 15或{age:15,sex:'男'}
  5. }
  6. }
  7. //在组件中调用 $store.commit('edit',{age:15,sex:'男'})

Vue组件如果调用某个VueX的方法过程中需要向后端请求时或者说出现异步操作时,需要dispatch VueX中actions的方法,以保证数据的同步。可以说,action的存在就是为了让mutations中的方法能在异步操作中起作用。
如果没有异步操作,那么我们就可以直接在组件内提交状态中的Mutations中自己编写的方法来达成对state成员的操作。

(3)增删state中的成员

Vue.set 为某个对象设置成员的值,若不存在则新增

  1. Vue.set(state,"age",15)

Vue.delete 删除成员

  1. Vue.delete(state,'age')

(4)Actions

由于直接在mutation方法中进行异步操作,将会引起数据失效。所以提供了Actions来专门进行异步操作,最终提交mutation方法。

Actions中的方法有两个默认参数

  • context上下文(相当于箭头函数中的this)对象
  • payload 挂载参数
  1. actions:{
  2. aEdit(context,payload){
  3. return new promise((resolve,reject)=>{
  4. setTimeout(()=>{
  5. context.commit('edit',payload)
  6. resolve()
  7. },2000)
  8. })
  9. }
  10. }
  11. //在组件中调用 this.$store.dispatch('aEdit',{age:15})

(5)Getters

可以对state中的成员加工后传递给外界
Getters中的方法有两个默认参数

  • state 当前VueX对象中的状态对象
  • getters 当前getters对象,用于将getters下的其他getter拿来用

例如

  1. getters:{
  2. nameInfo(state){
  3. return "姓名:"+state.name
  4. },
  5. fullInfo(state,getters){
  6. return getters.nameInfo+'年龄:'+state.age
  7. }
  8. }
  9. //在组件中调用 this.$store.getters.fullInfo

(6)Models

当项目庞大,状态非常多时,可以采用模块化管理模式。Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。

  1. //store/index.js
  2. import Vue from "vue";
  3. import Vuex from "vuex";
  4. Vue.use(Vuex);
  5. import test from "./modules/test.js" // 引入ai 模块
  6. export default new Vuex.Store({
  7. modules: {
  8. test
  9. }
  10. })
  11. //store/modules/test.js
  12. export default {
  13. namespaced: true, //开启命名空间,被模块化的store须要开启命名空间
  14. state:{ //存放所要管理的状态
  15. name:'helloVueX'
  16. },
  17. mutations:{ //同步改变state
  18. changeName(state,name){
  19. state.name = name
  20. }
  21. },
  22. actions:{ //异步改变state
  23. changeName(context,name){
  24. return new promise((resolve,reject)=>{
  25. setTimeout(()=>{
  26. context.commit('changeName',name)
  27. resolve()
  28. },2000)
  29. })
  30. }
  31. },
  32. getters:{ //对state中的成员加工后传递给外界
  33. nameInfo(state){
  34. return "姓名:"+state.name
  35. }
  36. }
  37. }

详情见:https://www.jianshu.com/p/2e5973fe1223

(7)vuex封装

目录结构
image.png
index.js

  1. //index.js
  2. import Vue from 'vue'
  3. import Vuex from 'vuex'
  4. import getters from './getters'
  5. Vue.use(Vuex)
  6. // https://webpack.js.org/guides/dependency-management/#requirecontext
  7. const modulesFiles = require.context('./modules', true, /\.js$/)
  8. // you do not need `import app from './modules/app'`
  9. // it will auto require all vuex module from modules file
  10. const modules = modulesFiles.keys().reduce((modules, modulePath) => {
  11. // set './app.js' => 'app'
  12. const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
  13. const value = modulesFiles(modulePath)
  14. modules[moduleName] = value.default
  15. return modules
  16. }, {})
  17. const store = new Vuex.Store({
  18. modules,
  19. getters
  20. })
  21. export default store

modules

  1. // ./modules/xxx.js
  2. const state = {
  3. jj_name:'',
  4. jj_data:{},
  5. }
  6. const mutations = {
  7. send_jj_name: (state, data) => {
  8. state.jj_name = data
  9. },
  10. send_jj_data: (state, data) => {
  11. state.jj_data = data
  12. }
  13. }
  14. const actions = {
  15. async set_jj_name(context, data){
  16. await context.commit('send_jj_name',data)
  17. },
  18. async set_jj_data(context, data){
  19. await context.commit('send_jj_data',data)
  20. },
  21. }
  22. export default {
  23. namespaced: true,
  24. state,
  25. mutations,
  26. actions
  27. }

getters.js

  1. // getters.js
  2. const getters = {
  3. jj_name: state => state.xxx.jj_name,
  4. jj_data: state => state.xxx.jj_data,
  5. }
  6. export default getters

(8)mapState、mapActions、mapGetters、mapMutations

  1. import { mapState, mapGetters, mapActions, mapMutations } from 'vuex'
  2. computed: {
  3. ...mapState([
  4. 'aaa',
  5. 'bbb',
  6. 'ccc',
  7. 'ddd'
  8. ]),
  9. ...mapGetters([
  10. 'count'
  11. ])
  12. },
  13. methods: {
  14. ...mapActions([
  15. 'getAaa'
  16. ]),
  17. ...mapMutations([
  18. 'addAge'
  19. ])
  20. }