美文网首页
vuex的模块化使用

vuex的模块化使用

作者: 年轻人多学点 | 来源:发表于2022-07-05 21:47 被阅读0次
    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.dispatch('命名空间/actions里的函数名',参数数据), this.store.commit('命名空间/mutations里的函数名',参数数据)

    相关文章

      网友评论

          本文标题:vuex的模块化使用

          本文链接:https://www.haomeiwen.com/subject/dkpqgktx.html