• 【vue】vuex中modules的基本用法


    1,什么时候用modules

    由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。
    为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割
    在模块中使用:namespaced: true, 命名空间,添加之后,当前模块下的标识符可以和其它模块相同,用于解决不同模块的命名冲突问题

    2,store文件结构

    3.1 index.js中手动引入modules

    1. import Vue from 'vue'
    2. import Vuex from 'vuex'
    3. import bus from './modules/bus'
    4. import app from './modules/app'
    5. const path = require('path')
    6. Vue.use(Vuex)
    7. let store = new Vuex.Store({
    8. state: {
    9. },
    10. mutations: {
    11. },
    12. actions: {
    13. },
    14. modules: {
    15. namespaced: true,
    16. app,
    17. bus
    18. }
    19. });
    20. export default store

    3.2 index.js 中动态引入modules

    1. import Vue from 'vue'
    2. import Vuex from 'vuex'
    3. const path = require('path')
    4. Vue.use(Vuex)
    5. const files = require.context('./modules', false, /\.js$/)
    6. let modules = {}
    7. files.keys().forEach(key => {
    8. let name = path.basename(key, '.js')
    9. modules[name] = files(key).default || files(key)
    10. })
    11. let store = new Vuex.Store({
    12. state: {
    13. },
    14. mutations: {
    15. },
    16. actions: {
    17. },
    18. modules
    19. });
    20. export default store

    4,app.js 文件中代码

    1. let user = {
    2. namespaced: true,
    3. state: {},
    4. mutations: {
    5. setUser(state, val) {
    6. state.user = val;
    7. }
    8. },
    9. getters: {},
    10. actions: {
    11. setName(state, val) {
    12. return new Promise(resolve => {
    13. setTimeout(function () {
    14. state.user = val;
    15. resolve(state.user);
    16. }, 2000)
    17. })
    18. }
    19. }
    20. }
    21. export default user;

     5,配置main.js,挂载store

    1. new Vue({
    2. el: '#app',
    3. router,
    4. store,
    5. components: { App: App },
    6. template: ''
    7. })

    6,vue中使用

    1. // commit 执行mutations里的方法,同步操作
    2. this.$store.commit('app/setUser', {name: '张三'});
    3. console.log(this.user.name);
    4. // dispatch 执行actions里的方法,异步操作
    5. this.$store.dispatch('app/setName', {name: '李四'}).then(res => {
    6. console.log(res.name);
    7. })

    7,js中使用

    1. // 引入 这里的store 就相当于页面中的 this.$store
    2. import store from '@/store'
    3. export const setCurUser = (user) => {
    4. let curUser = store.app.user
    5. if(!curUser) {
    6. store.commit("app/setUser", user)
    7. return user
    8. }
    9. return curUser
    10. }

    注意:

    1,vue和vuex的版本搭配

    vue2使用vuex3;vue3使用vuex4. 否则会出现this.$store为undefined错误

    延伸:

    1,vuex的五种状态 state、getter、mutation、action、module

    state:所有共享数据统一放到state中,与data类似

    mutation: 类似于事件,用于改变状态

    action: 和mutation相似,但是action是异步操作

    getter: 类似vue中的computed,进行缓存,形成新的数据

    modules: 分模块,大型项目一个对象管理会很臃肿

  • 相关阅读:
    Keil编程不同驱动文件引用同一个常量的处理方法
    java高级用法之:在JNA中使用类型映射
    机器学习 | 使用Python开发多输出回归模型
    进程和线程
    Spring Boot+Vue3前后端分离实战wiki知识库系统之用户管理&单点登录
    Springboot:拦截器和过滤器
    建立密切业务合作关系,供应商SRM系统助力企业做好新材料供应商品质管控
    leetcode做题笔记133. 克隆图
    全面对比GPT-3.5与LLaMA 2微调
    Web3 时代 传统品牌如何玩转 NFT 营销?
  • 原文地址:https://blog.csdn.net/u013517229/article/details/127906004