Vuex命名空间及如何获取根模块、兄弟模块状态管理器

news2024/12/25 9:03:41

模块化思想

import global from './modules/global';
import form from './modules/form';
import formDesign from './modules/form-design';
...

const store = new Vuex.Store({
  state: {},
  mutations: {},
  actions: {},
  strict: true,
  modules: {
    global,
    form,
    formDesign,
    ...
  },
  ...
}

 

 此时这个项目结构就很简单清晰啦 ,我们来看看模块的状态管理器长啥样

        其实就是和状态管理器一样,有state有mutations ,甚至你喜欢的话,还可以往里面继续嵌套模块module。形成三级、四级、五级等等多层级的模块化状态管理器。

命名空间

        上面看到,我们把主状态管理器分割为多个模块。默认情况下,模块内部的 action、mutation 和 getter 是注册在全局命名空间的,这样使得多个模块能够对同一 mutation 或 action作出响应。所以我们需要单独的命名空间保证模块化管理的封装度和复用性。

        首先我们需要在单个模块中通过添加namespaced:true的方式使其成为带命名空间的模块,也就是刚才我们看到的:

const file = {
  namespaced: true,
  state: {
      fileName:'小文件',
      ...
  },
  mutations: {
    ...
  },
  actions: {
    ...
  },
};

export default file;

 此时在组件内部,获取state的方法

this.$store.state.file.fileName

 此时在组件内部,获取getters的方法

this.$store.getters['file/fileGetter']

  此时在组件内部,执行Mutations的方法

 this.$store.commit('file/fileMutation');

此时在组件内部,执行Actions的方法

this.$store.dispatch('file/fileAction')

带命名空间的moduleA,moduleB模块中,获取根store的state ,getters

   state数据: 通过rootState参数    即:rootState.属性名

          getter方法:通过rootGetters参数来获取   即:rootGetters.countStudentNumber

{
...
actions: {
    async init({state,rootState,rootGetters}) {
         return rootGetters.countStudentNumber
    },
}
}

        如果要传承,可以这样写:

// 主store下的
getters: {
    applicationAdminPermission: (state) => (appId) =>
      state.applicationAdminList.includes(appId),
}

        主store的getters里的函数接收state内参和appid外参。子模块moduleA调用这个getters方法并传参:

{
...
actions: {
    async checkIt({state,rootState,rootGetters}) {
        const checkResult = rootGetters.applicationAdminPermission('usyddjj16236')
    },
}
}

        如果你想传多个参数,只能以对象的形式传参

// 主store下的
getters: {
    applicationAdminPermission: (state) => (appObj) =>
      state.applicationAdminList.includes(appObj.appId),
}
{
...
actions: {
    async checkIt({state,rootState,rootGetters}) {
        const checkResult = rootGetters.applicationAdminPermission({appName:'大傻逼',appId:'usyddjj16236'})
    },
}
}

带命名空间的moduleA,moduleB模块中,获取根store的actions和mutations

         提交mutations:

actions: {
    changeTenant() {
        //increment为根store中的mutation
        commit('increment',null,{root:true});    
    }
}

        分发actions:

actions: {
    changeTenant() {
        //increment为根store中的actions
        dispatch('increment',{tenant:'xxx'},{root:true});    
    }
}

           其实就是加上{root:true}这个option。而主Vuex下的actions和mutations并不需要特殊处理。

带命名空间的moduleA,moduleB模块中,获取兄弟模块的state和getters

        moduleA:

const moduleA = {
    namespaced: true,
    state: {
        title:'我叫moduleA'
    },
    getters: {    
        customTitle(state){
            return '你好' + state.title
        }
    }
};

export default moduleA;

        moduleB获取moduleA的state和getters

const moduleB = {
    namespaced: true,
    state: {
        title:'我叫moduleB'
    },
    actions: {
        getModuleAstate({
            state,
            commit,
            dispatch,
            rootState,
        }){
            
            console.log(rootState.moduleA.title)

        },
        getModuleAGetters({rootGetters}) {
            console.log(rootGetters['moduleA/customTitle'])
        }
    }
};

export default moduleB;

带命名空间的moduleA,moduleB模块中,获取兄弟模块的actions和mutations

        moduleA:

const moduleA= {
    namespaced: true,
    state: {},
    mutations: {
        Aaaa(state,{val}){
            console.log(val)
        },
    },
   actions: {
        Abbb({state},{val}){
            console.log(val)
        },
    }
};

export default moduleA;

        moduleB:

const ceshi2 = {
    namespaced: true,
    state: {
       
    },
    mutations: {
       
    },
    actions: {
        hanleChange({
            rootState,
        }){
            commit('moduleA/Aaaa',{val:'你好我的朋友'},{root:true})
            dispatch('moduleA/Abbb',{val:'你好我的宝贝'},{root:true})
        },
    }
};

在带命名空间的模块中,如何将action注册为全局actions

            需要完成:

           ①添加 root: true
           ②并将这个 action 的定义放在函数 handler 中


//storeAction在命名空间moduleA中,但是它是一个全局actions
const moduleA = {
    namespaced:true,
    storeAction:{
        root:true,  //条件1
        handler(namespacedContext, payload){//条件2:handler
            //namespacedContext 上下文信息
            //payload 载荷,即参数
            console.log(namespacedContext)
            console.log(payload)
            alert("我是模块A中的全局storeAction")
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1038761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

现场直击|亚数TrustAsia精彩亮相IOTE深圳物联网展,CSA联盟展台等你来!

2023年9月20日,IOTE 2023第二十届深圳国际物联网展在深圳国际会展中心(宝安)顺利开幕。作为物联网领域年度最重要的行业盛会之一,本次展会汇聚全球来自工业、物流、基建、智慧城市、智慧零售等领域的600企业、10万行业人士&#x…

springboot 获取参数

1.获取简单参数 2.实体对象参数

软考高级+系统架构设计师教程+第二版新版+电子版pdf

注意!!! 系统架构设计师出新版教程啦,2022年11月出版。所以今年下半年是新版第一次考试,不要再复习老版教程了,内容改动挺大的。 【内容简介】系统架构设计师教程(第2版)作为全国计…

RuntimeException

1.介绍 说明:RuntimeException是一个运行时异常类,通常用于处理程序运行时发生的异常,例如空指针异常、数组越界异常等。运行时异常类是在程序中出现这类异常时,即使没有try...catch语句捕获异常或使用throws关键字声明抛出异常&…

漫谈:C语言 C++ 左值、右值、类型转换

编程不是自然语言&#xff0c;编程自有其内在逻辑。 左值引起的BUG 编译器经常给出类似这样的BUG提示&#xff1a; “表达式必须是可修改的左值” “非常量引用的初始值必须是左值” 看一下示例&#xff1a; #include <iostream>void f(int& x) {} int main() {sho…

激活函数总结(四十一):激活函数补充(ShiLU、ReLUN)

激活函数总结&#xff08;四十一&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 ShiLU激活函数2.2 ReLUN激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、ELU、SELU、GELU、Softmax、Sof…

实验五 熟悉 Hive 的基本操作

实验环境&#xff1a; 1.操作系统&#xff1a;CentOS 7。 2.Hadoop 版本&#xff1a;3.3.0。 3.Hive 版本&#xff1a;3.1.2。 4.JDK 版本&#xff1a;1.8。 实验内容与完成情况&#xff1a; &#xff08;1&#xff09;创建一个内部表 stocks&#xff0c;字段分隔符为英文逗号…

PS4 9.0 使用ESP32 自动破解器时如何保持 内/外网通讯 | PS4 9.0 ESP32 HEN with Internet

环境&#xff1a;PS49.0 ESP32 破解器 群晖 问题&#xff1a;连接到破解器无线网络后无法与内外网通讯&#xff0c;需要先golden hen后再切换无线网络 解决办法&#xff1a;修改ESP32 WIFI工作模式为WIFI 客户端模式 背景&#xff1a;当我在PS4 9.0上使用ESP32时&#xff0c;…

spingboot之devtools热部署IntelliJ IDEA 2022.2.3不生效问题,解决

目录 环境&#xff1a; 添加依赖&#xff1a; 修改idea配置&#xff1a; 步骤一&#xff1a;“command,”命令进入配置界面。勾选下面配置 步骤二&#xff1a;进入Advanced Setting设置 步骤三&#xff1a;修改启动配置 步骤四&#xff1a;保存 开发过程中避免不了代码…

uniapp iconfont-引用阿里巴巴矢量图标库

k-icons-font图标插件: https://ext.dcloud.net.cn/plugin?id14612 下载图标库 https://www.iconfont.cn/ 为了方便使用设置FontClass为空&#xff0c;当然不设置也可以 下载图标库 将图标可以中的&#xff1a;iconfont.css、iconfont.ttf拷贝到插件目录上"k-icons-f…

助力养殖行业数字化转型,基于深度学习模型开发构建羊脸识别系统

养殖行业的数字化进程在国内还是比较缓慢的&#xff0c;一些大厂在前面的一些探索时期做过一些相关的工作&#xff0c;但是受限于各种因素并没有能够广泛地铺展开来&#xff0c;数字化不应该被理解为非常高大上的遥不可及的东西&#xff0c;数字化也不应该成为中低产的一道鸿沟…

C++标准模板库STL——list的使用及其模拟实现

1.list的介绍 list的文档介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个…

【Kubernetes】Kubernetes的污点和容忍度

Kubernetes的污点和容忍度 在K8S中&#xff0c;如果Pod能容忍某个节点上的污点&#xff0c;那么Pod就可以调度到该节点。如果不能容忍&#xff0c;那就无法调度到该节点。污点和容忍度就像谈恋爱的小情侣&#xff0c;你情我愿&#xff0c;女生知道男生的缺点&#xff0c;却依然…

【EI会议征稿】第八届能源系统、电气与电力国际学术会议(ESEP 2023)

第八届能源系统、电气与电力国际学术会议&#xff08;ESEP 2023&#xff09; 2023 8th International Conference on Energy System, Electricity and Power 第八届能源系统、电气与电力国际学术会议&#xff08;ESEP 2023&#xff09;定于2023年11月24-26日在中国武汉隆重举…

nacos配置中心的核心概念

书接上一篇https://blog.csdn.net/qq_45451226/article/details/133250390 1.命名空间(用于配置隔离) 默认&#xff1a;public(保留空间)&#xff1b;默认新增的所有配置都在public空间。 开发&#xff0c;测试&#xff0c;生产&#xff1a;利用命名空间来做环境隔离。 在de…

AVL树的模拟实现(c++)

目录 搜索二叉树对于搜索查询来说是非常快的&#xff0c;但是它有着致命的缺陷&#xff0c;如果插入的数据是有序的&#xff0c;那么它的结构就会变成单链表&#xff0c;这对于搜索查询来说是非常不利的&#xff0c;因此为了解决搜索树的缺陷&#xff0c;弥补它的不足&#xff…

opencv实现仿射变换和透射变换

##1&#xff0c; 什么是仿射变换&#xff1f; 代码实现 import numpy as np import cv2 as cv import matplotlib.pyplot as plt#设置字体 from pylab import mpl mpl.rcParams[font.sans-serif] [SimHei]#图像的读取 img cv.imread("lena.png")#仿射变换 row…

loadEnv是vite的工具函数

loadEnv()函数返回一个对象&#xff0c;这个对象就是根据开发模式还是生产环境加载的.env.development文件里的环境变量&#xff0c;有系统自带的也有自己手写的 loadEnv(第1个参数&#xff0c;第2个参数&#xff0c;第3个参数) 注意&#xff1a;第3个参数如果是“”空字符…

一百八十六、大数据离线数仓完整流程——步骤五、在Hive的DWS层建动态分区表并动态加载数据

一、目的 经过6个月的奋斗&#xff0c;项目的离线数仓部分终于可以上线了&#xff0c;因此整理一下离线数仓的整个流程&#xff0c;既是大家提供一个案例经验&#xff0c;也是对自己近半年的工作进行一个总结。 二、数仓实施步骤 &#xff08;五&#xff09;步骤五、在Hive的…

华为孟晚舟:从最惨千金 到最强战士

作者&#xff1a;积溪 简评&#xff1a;华为25号开发布会&#xff0c;有何深意&#xff1f;从最惨千金到最强战士&#xff0c;孟晚舟和华为都回来了 #华为发布会 #孟晚舟 #任正非 #华为 华为发布会 在打谁的脸&#xff1f; 苹果只是前菜 今天才是正餐 两年前的今天 华为…