vuex的模块化使用

import Vue from 'vue'
import Vuex from 'vuex'
 
Vue.use(Vuex)
// 首先声明一个需要全局维护的状态 state,比如 我这里举例的resturantName
 
 
// https://webpack.js.org/guides/dependency-management/#requirecontext
const modulesFiles = require.context('./modules', false, /\.js$/)
 
// you do not need `import app from './modules/app'`
// it will auto require all vuex module from modules file
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
  // set './app.js' => 'app'
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
  const value = modulesFiles(modulePath)
  modules[moduleName] = value.default
  return modules
}, {})
 
 
// 注册上面引入的各大模块
const store = new Vuex.Store({
  modules,
  state: {
    loading: false
  }, // 共同维护的一个状态,state里面可以是很多个全局状态
  getters: {
    AsyncLoading(state) {
      return state.loading
    }
  }, // 获取数据并渲染
  actions: {
 
  }, // 数据的异步操作
  mutations: {
    staetLoading(state) {
      state.loading = true
    },
    endLoading(state) {
      state.loading = false
    }
  } // 处理数据的唯一途径,state的改变或赋值只能在这里
})
 
export default store // 导出store并在 main.js中引用注册。
image.png

image.png

1.modules下文件是模块化的划分,里面的js有state,action,mutations.然后通过

export default {
namespaced: true,
state,
mutations,
actions
}

方式导出。

2.index.js中导出的格式如下

new Vuex.Store({
  modules:{
      app:{
          namespaced:true,
          state:{},
          mutations:{},
          actions:{}
      },
      ...
  },
  getters:{
    sidebar: state => state.app.sidebar,
    size: state => state.app.size,
    device: state => state.app.device,
    sjhnum: state => state.shangjinhui.num,
    ...
  }
})

所以index.js中需要先对modules进行处理,通过require.context获取modules下所有js文件,如下

const modulesFiles = require.context('./modules', true, /\.js$/)
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')     
  const value = modulesFiles(modulePath)
  modules[moduleName] = value.default                               
  return modules
}, {})

然后对getters的处理可以摘出来放到单独js里。

因为modules的处理,下面相对于普通的使用方式多了个命名空间

3.获取store里的数据

1 this.$store.state.命名空间.

2 import { mapState } from 'vuex';

computed:{

...mapGetters({

'getters里定义的key(其实对应的state值)'

})

}

4修改store值

this.store.commit('命名空间/mutations里的函数名',参数数据)

你可能感兴趣的:(vuex的模块化使用)