手写vuex4源码(六)命名空间实现

news/2024/11/29 1:37:16/

一、命名空间使用

在子模块对象中添加 namespaced:true,为模块开启命名空间功能;

开启命名空间功能,相当于为每个模块添加独立的作用域,实现模块间状态和事件的隔离;

二、命名空间实现逻辑

在模块注册阶段,会通过类似发布订阅的方式将各模块中的 action、mutation 进行收集并注册,需要根据模块是否开启命名空间状态,为模块拼接命名空间前缀;

所以,可以统一理解为,在事件订阅时,为事件添加对应命名空间标识即可;

三、命名空间实现

1、命名空间标识

在模块收集注册时,添加是否开启命名空间标识

export default class Module {constructor(rawModule) {...this.namespaced = rawModule.namespaced; // 自己是否有命名空间}
}

2、拿到namespace

installModule安装时需要用到namespace,在installModule中调用方法获取命名空间

function installModule(store, rootState, path, module) {// 递归安装let isRoot = !path.length; // 如果数组是空数组 说明是根,否则不是// 下面需要使用namespace,在这里把命名空间进行处理const namespaced = store._modules.getNamespaced(path); // [a,c]console.log('--',path);console.log(namespaced);}

_moduleModuleCollection生成的,在ModuleCollection定义getNamespaced方法

getNamespaced(path) {let module = this.root // [a,c] a/creturn path.reduce((namespaceStr, key) => {module = module.getChild(key); // 子模块return namespaceStr + (module.namespaced ? key + '/' : '')}, '')}

在这里插入图片描述

3、实现getter、mutation、action的命名空间

以getter为例,拼接时属性名前面加上namespaced

 store._wrappedGetters[namespaced + key] = () => {// 通过这个方法去获取最新的statereturn getter(getNestedState(store.state, path));};

四、测试

 a模块-------------------{{ aCount }}<br>b模块-------------------{{ bCount }}<br>c模块-------------------{{ cCount }}<br><button @click="$store.commit('aCount/add',1)">change a</button><button @click="$store.commit('bCount/add',1)">change b</button><button @click="$store.commit('aCount/cCount/add',1)">change c</button>

在这里插入图片描述

五、核心逻辑梳理

  • 在 ModuleCollection 模块收集类中,提供根据 path 获取命名空间标识的能力:getNamespaced(path);
  • 在 installModule 模块安装时,通过调用getNamespaced(path) 获取当前模块的命名空间标识;
  • 在安装/注册mutation、action、getter 时,为对应的事件添加(拼接)上命名空间标识;
    这样,就实现了 Vuex 命名空间 namespaced 功能,即:根模块与各子模块中定义的事件完全独立互不影响;

http://www.ppmy.cn/news/42014.html

相关文章

【神经网络】tensorflow实验5--数字图像基础

目录 1. 实验目的 2. 实验内容 3. 实验过程 题目一&#xff1a; ① 代码 ② 实验结果 题目二&#xff1a; ① 代码 ② 实验结果 4. 实验小结&讨论题 1. 实验目的 ①了解数字图像基本属性&#xff1b; ②掌握Pillow图像处理库的基本操作。 2. 实验内容 ①使用Pill…

BGP与OSPF混合组网

如图。R1和R2之间是OSPF Area 0,R23和R4之间是OSPF Area 1,R5和R6之间是OSPF Area2。除了R1和R2之间的cost是100,其余链路的cost都是10. AR1/2/3/4/5/6之间通过Loopback口建立IBGP全互联邻居关系,并且都是AS11520,和外部建立EBGP邻居访问100.100.100.1的网络。(不确定图中…

穿戴规范智能识别系统 yolov7

穿戴规范智能识别系统通过yolov7python网络模型AI深度视觉学习算法&#xff0c;穿戴规范智能识别系统对工厂画面中人员穿戴行为自动识别分析&#xff0c;发现现场人员未按照规定穿戴着装&#xff0c;立即抓拍告警。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c…

(邱维声)高等代数课程笔记:n 元排列

n 元排列 \quad回顾一下&#xff0c;数域 KKK 上的 nnn 元线性方程组解的情况有几种&#xff1f;前面我们通过对增广矩阵作初等行变换化为阶梯形已经解决了这个问题。 \quad但事实上&#xff0c;化完阶梯形后&#xff0c;这个方程组的求解已经完成的差不多了。换言之&#xff0…

Python 小型项目大全 6~10

六、凯撒密码 原文&#xff1a;http://inventwithpython.com/bigbookpython/project6.html 凯撒密码是朱利叶斯凯撒使用的一种古老的加密算法。它通过将字母在字母表中移动一定的位置来加密字母。我们称移位的长度为密钥。比如&#xff0c;如果密钥是 3&#xff0c;那么A变成D&…

关键词数据分析-搜索词和关键词分析工具

要搜索热门关键词获取&#xff0c;可以采用以下几种方法&#xff1a; 使用百度指数&#xff1a;百度指数是一个实用的工具&#xff0c;可用于查看关键词的热度趋势、搜索量等数据。在百度指数中&#xff0c;您可以输入您要搜索的关键词&#xff0c;并查看近期的相关数据。这可以…

【Unity VR开发】结合VRTK4.0:创建一个按钮(Option Button)

语录&#xff1a; 如同天上降魔主&#xff0c;真是人间太岁神。 前言&#xff1a; 选项按钮是一种提供多项选择选项的方法&#xff0c;其中只有一个按钮可以处于激活状态&#xff0c;激活另一个按钮时将确保组中的所有其他按钮都已停用。我们可以使用嵌套在预制件中的预制件来实…

uniapp页面后退时更改页面内容【uniapp如何区分页面是跳转来的还是后退来的】【伸手党福利】

目录应用场景实现目标分析技术难点解决方法另附&#xff1a;自动登录判断跳转页面ps2 这个案例的实际简单的解决方法应用场景 建立一个自动登录的中间页&#xff0c;如果自动登录&#xff0c;则自动跳转到内部应用。如果自动登录失败&#xff0c;则显示用户名密码输入页。 发现…