VUEX模块化的基础应用,一看就会

1 篇文章 0 订阅

Vuex模块化的简单实用技巧分享,笔者也是第一次使用,觉得有必要,就记录了一下,如果真的有帮助到你,是我的荣幸

为什么要使用vuex模块化?(官方回答)

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的
state、mutation、action、getter、甚至是嵌套子模块

1、目录结构
-|store
-|-|projectName // 项目目录
-|-|-|modules // 模块文件夹
-|-|-|-|modulesA.js // 模块A
-|-|-|-|modulesB.js // 模块B
-|-|-|index.js
2、index.js目录
import Vue from 'vue'
import Vuex from 'vuex'

import modulesA from './modules/modulesA'
import modulesB from './modules/modulesB'

Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    modulesA,
    modulesB
  }
})

3、modulesA.js文件
const state = {
  name: '模块A'
}

const getters = {
  getName(state) {
    return `这是${state.name}`
  }
}

const mutations = {
  updateName(state, data) {
    const { name } = data || {}
    
    state.name = name
  }
}

const actions = {}

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

4、moduleB.js文件
const state = {
  name: 'moduleB',
  count: 0
}

const getters = {}

const mutations = {
  updateCount(state, data) {
    const { count } = data || {}

    state.count = count
  },
}

const actions = {
  setCount(content, { count }) {
    const { commit } = content
    
    return new Promise((resolve) => {
      setTimeout(() => {
        commit('updateCount', { count })
        resolve()
      }, 500)
    })
  },
}

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

  • export要记得加上namespaced: true这样如果两个模块有同名的方法或数据就可以用模块名来区分。
  • 每个模块文件单独写自己的stategettersactionsmutations最后export出来。
5、在vue文件中使用
<template>
  
</template>

<script>
/** vuex提供的辅助函数 */
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'

export default {
  name: 'test',
  data() {
    return {}
  },
  computed: {
    /** 引入模块中的state的具体属性 */
    ...mapState({
      name: state => state.moduleA.name,
      nameB: state => state.moduleB.name, // 支持起别名
      count: state => state.moduleB.count
    }),
    
    /** 引入模块中getters的具体计算属性 */
    ...mapGetters({
      getName: 'moduleA/getName'
    })
  },
  
  mounted() {
    /** 使用模块中state */
    console.log('name:', this.name)
    console.log('nameB:', this.nameB)

    /** 输出模块中的getters */
		console.log('getName:', this.getName)
    
    /** 提交mutations */
    this.updateName({ name: 'test' })
    this.updateCount({ count: 1 })
    
    /** 分发actions */
    setCount({ count: 2 })
  },
  
  methods: {
    /** 引入模块中的mutations */
    ...mapMutations({
      updateName: 'moduleA/updateName',  
      updateCount: 'moduleB/updateCount'
    }),

    /** 引入模块中的actions */
    ...mapActions({
      setCount: 'moduleB/setCount'
    })
  }
}
</script>

  • vuex中引入mapStatemapGettersmapActionsmapMutations对应的映射出模块中的数据和方法,设置了namespaced: true后通过moduleA/des来引用对应模块的数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值