关于Vuex的拆分和分模块组织管理


前言

如果我们的Vue项目较为复杂的话很多时候也伴随着冗杂的Vuex的数据存储部分,对Vuex进行拆分和分模块组织管理可以有效的简化Vuex,使其功能明确,结构简洁。


提示:以下是本篇文章正文内容,下面案例可供参考

一、对Vuex进行拆分

拆分Vuex可以从一个完整的数据仓库入手,把其中的state,action,mutations等部分写为单独的js或ts文件,再使用ES6的模块化语法导入和导出,起到一个规范的作用。
在不拆分之前:

index.ts:
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    msg: "I'm Vuex",
    list: [1, 2, 3]
  },
  mutations: {
    setMsg(state, newValue: string) {
      state.msg = newValue;
    },
    setList(state, newValue: Array<number>) {
      state.list = newValue;
    }
  },
  actions: {
  },
  modules: {
  }
})

逐步拆分:
1,对state进行拆分:将state作为一个单独的ts文件:

state.ts内容:

注意一定要导出!

export default {
    msg: "I'm Vuex!",
    list: [1,2,3,4]
}

在index.ts文件中导入state:

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state';

Vue.use(Vuex)

export default new Vuex.Store({
  state,
  mutations: {
    setMsg(state, newValue: string) {
      state.msg = newValue;
    },
    setList(state, newValue: Array<number>) {
      state.list = newValue;
    }
  },
  actions: {

  },
  modules: {
  }
})

同理,拆分mutations和actions也是一样的:

mutations.ts:
interface state {
    msg: string,
    list: Array<number>
}
export default {
    setMsg(state: state, newValue: string) {
        state.msg = newValue;
    },
    setList(state: state, newValue: Array<number>) {
        state.list = newValue;
    }
}
actions.ts:
export default {
    // 需要执行的方法;
}

然后在index.ts中导入即可:

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state';
import mutations from './mutations';
import actions from './actions';
Vue.use(Vuex)

export default new Vuex.Store({
  state,
  mutations,
  actions,
  modules: {
  }
})

是不是简明了不少?
此时store的结构:
在这里插入图片描述
那么我们在组件中调用store中的数据看看是否可行:
使用辅助函数获取数据:
在这里插入图片描述
在这里插入图片描述
运行结果:说明拆分成功!
在这里插入图片描述

二、对Vuex进行分模块组织管理

如果我们的项目较为复杂,需要存储的数据门类很多,就不适合在一个模块中存储了,不然store会十分的冗杂,难以维护。所以面对这样的情况,我们可以对Vuex进行分模块的管理,这样可以让人对模块用处一目了然,同时利于维护。接下来我们来介绍一下分模块组织Vuex的步骤.

假设我们除了基本的模块以外,还需要处理用户(user)和商品(products)模块,为了便于管理,我们对他们进行拆分:
我们先在store目录下创建一个modules文件夹,专门用于处理模块化的vuex:在这里插入图片描述
先处理user模块部分:
在modules目录下创建user.ts文件,将需要的数据和处理方法写入文件中:

// 存储所有和用户相关的数据:
interface state {
    userName: string
}
const state: state = {
    userName: 'Simon'
}
const mutations = {
    setUserName(state: state, newValue: string) {
        state.userName = newValue;
    }
}
// 导出
export default {
    state,
    mutations
}

然后我们把导出的user模块再导入到主模块的modules中:
index.ts:

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state';
import mutations from './mutations';
import actions from './actions';
// 导入用户模块:
import user from './modules/user';
Vue.use(Vuex)

export default new Vuex.Store({
  state,
  mutations,
  actions,
  // 此处添加了用户模块;
  modules: {
    user
  }
})

那么商品模块也是类似的做法:
在modules目录下创建一个products.ts文件:

// 存储所有和商品有关的数据:
interface state {
    price: number
}
const state: state = {
    price: 999
}
const mutations = {
    setPrice(state: state, newValue: number) {
        state.price = newValue;
    }
}
export default {
    state,
    mutations
}

再导入到主模块的module部分:
index.ts:

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state';
import mutations from './mutations';
import actions from './actions';
// 导入用户模块:
import user from './modules/user';
// 导入商品模块:
import products from './modules/products';
Vue.use(Vuex)

export default new Vuex.Store({
  state,
  mutations,
  actions,
  modules: {
    user,
    products
  }
})

那么接下来就测试一下是否成功:
注意:在组件中若想要获取模块中的数据,需要先将模块获取,此处使用辅助函数:

computed: {
    // 获取store的数据,此处需要获取user和products模块:
    ...mapState(['msg', 'list', 'user', 'products'])
  },
<div>
	 {{ '用户姓名' }}--{{ user.userName }}
    <br />
    {{ '商品价格' }}--{{ products.price }}```
</div>

运行结果:
在这里插入图片描述
分模块组织成功!

总结

以上就是对拆分Vuex和分模块组织Vuex的介绍和讲解,这也是项目中常用的配置,欢迎小伙伴们一起交流学习。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值