手撕Vuex-安装模块数据
前言
根据上一篇,【手写Vuex】-提取模块信息,我们已经可以获取到模块的信息了,将模块信息变成了我们想要的数据结构,接下来我们就要根据模块的信息,来安装模块的数据。
在上一篇当中我们定义了一个 ModuleCollection 类,这个类的作用就是将模块的信息转换成我们想要的数据结构。
接下来我们就要根据这个数据结构来安装模块的数据。
安装模块数据
那么怎么安装模块数据呢?首先我们先看一下怎么安装数据,在安装数据之前,我们在创建 Store 的时候我们的 root 也就是根组件已经安装完毕了,所以我们的根组件就不用安装了,我们只需要安装根组件下面的子组件的数据就可以了。
那么安装子模块的数据我们怎么安装呢?我这里直接开辟一个全新的方法来处理这件事情,安装子模块的数据,我们先来看一下代码:
// 安装子模块的数据
this.initModules([], this.modules.root);
initModules(arr, module) {
}

如上我开辟对的方法我们先来看一下这个方法的参数,第一个参数是一个空数组,第二个参数是我们的根模块。
那么我们在这个方法里面要做什么呢?我们要做的就是安装子模块的数据,那么我们怎么安装子模块的数据呢?首先我们要知道当前的模块是不是根模块,如果是根模块的话,我们就不用安装了,因为根模块已经安装完毕了,我们只需要安装根模块下面的子模块就可以了。
那么我们怎么判断当前的模块是不是根模块呢?我们可以通过 arr 这个数组来判断,如果 arr 这个数组是空数组的话,那么我们就可以判断当前的模块是根模块,如果不是空数组的话,那么我们就可以判断当前的模块是子模块。
好了我们先上代码:
initModules(arr, module) {
if (arr.length > 0) {
}
for (let moduleName in module._children) {
this.initModules(arr.concat(moduleName), module._children[moduleName]);
}
}
在 initModules 当中我添加了一个 if,一个 for,if 主要作用就是用于判断如果当前模块是子模块,那么就需要将数据安装到 this.state 上面,对应着:
if (arr.length > 0) {
}
如果当前模块不是子模块,那么就需要从根模块中取出子模块的信息来安装,对应着:
for (let moduleName in module._children) {
this.initModules(arr.concat(moduleName), module._children[moduleName]);
}
好了我们先不继续往下写,我们先来打印一下 arr,看一下 arr 是什么样子的,我们来看一下打印的结果:

通过如上结果打印我们就可以很好的根据这个结构来完善我们的代码了, 思路是这样的,如果 arr 是空数组的话,那么我们就可以判断当前的模块是根模块,如果不是空数组的话,那么我们就可以判断当前的模块是子模块。
是子模块的话我们要做的就是将子模块的数据安装到 this.state 上面,如果是根模块的话,我们就不用安装了,因为根模块已经安装完毕了,我们只需要安装根模块下面的子模块就可以了。
代码继续往下走,我们现在主要编写的代码就是实现 if (arr.length > 0) 这个判断条件的代码,说明是子模块,我们是 arr 打印结果是 [] [home] [account] [account, login] 那么我们首先要安装的是 home,然后是 account,然后是 login。
那么我们怎么安装呢?如下:
if (arr.length > 0) {
let parent = arr.splice(0, arr.length - 1).reduce((state, currentKey) => {
return state[currentKey];
}, this.state);
Vue.set(parent, arr[arr.length - 1], module._state);
}
我们先来看一下这段代码,首先我们先来看一下 arr.splice(0, arr.length - 1) 这段代码,这段代码的作用就是将 arr 数组的最后一个元素去掉,然后返回一个新的数组,这个新的数组就是我们要安装的模块的父模块的路径。
然后我们再来看一下 reduce((state, currentKey) => { return state[currentKey]; }, this.state) 这段代码,这段代码的作用就是根据父模块的路径来获取到父模块的数据,然后我们再来看一下 Vue.set(parent, arr[arr.length - 1], module._state) 这段代码,这段代码的作用就是将子模块的数据安装到父模块的数据上面。
测试结果
好了我们先来看一下代码的执行结果:

总结
好了,这篇文章我们主要是实现了安装子模块的数据,我们通过一个新的方法来安装子模块的数据,然后我们通过一个 if 来判断当前的模块是不是子模块,如果是子模块的话,我们就将子模块的数据安装到父模块的数据上面,如果不是子模块的话,我们就不用安装了,因为根模块已经安装完毕了,我们只需要安装根模块下面的子模块就可以了。
可能大家对 arr.splice(0, arr.length - 1) 这段代码不是很理解,这段代码的作用就是将 arr 数组的最后一个元素去掉,然后返回一个新的数组,这个新的数组就是我们要安装的模块的父模块的路径。
例如我们的 arr 存放的是 [home] 那么我们的 arr.splice(0, arr.length - 1) 就会返回一个空数组,这个空数组就是我们要安装的模块的父模块的路径。
空数组的话,然后又调用了 reduce,这回是空数组,那么就会返回 this.state,也就是根模块的数据,然后我们再来看一下 Vue.set(parent, arr[arr.length - 1], module._state) 这段代码,这段代码的作用就是将子模块的数据安装到父模块的数据上面。
parent 就是根模块的数据,arr[arr.length - 1] 就是我们要安装的模块的名称,module._state 就是我们要安装的模块的数据。
这是没有层级嵌套的字模块安装的情况,我们再来看一个有层级嵌套的子模块安装的情况,例如我们的 arr 存放的是 [account, login] 那么我们的 arr.splice(0, arr.length - 1) 就会返回一个 [account] 数组,这个数组就是我们要安装的模块的父模块的路径。
然后我们再来看一下 reduce((state, currentKey) => { return state[currentKey]; }, this.state) 这段代码,这段代码的作用就是根据父模块的路径来获取到父模块的数据,例如我们的父模块的路径是 [account] 那么我们就会获取到 account 模块的数据,然后我们再来看一下 Vue.set(parent, arr[arr.length - 1], module._state) 这段代码,这段代码的作用就是将子模块的数据安装到父模块的数据上面。
parent 就是 account 模块的数据,arr[arr.length - 1] 就是我们要安装的模块的名称,module._state 就是我们要安装的模块的数据。
好了,这篇文章我们主要是实现了安装模块的数据,下一篇文章将会实现安装模块的方法。
手撕Vuex-安装模块数据的更多相关文章
- MySQL通过bin log日志恢复数据|手撕MySQL|对线面试官
关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第二篇文章,今天介绍一下MySQL的二进制日志(bin log),注意不要和MySQL的InnoDB ...
- 编译原理--05 用C++手撕PL/0
前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 05 用C++手撕PL/0 在之前 ...
- NN入门,手把手教你用Numpy手撕NN(一)
前言 这是一篇包含极少数学推导的NN入门文章 大概从今年4月份起就想着学一学NN,但是无奈平时时间不多,而且空闲时间都拿去做比赛或是看动漫去了,所以一拖再拖,直到这8月份才正式开始NN的学习. 这篇文 ...
- 第五章 Odoo 12开发之导入、导出以及模块数据
大多数Odoo 模块的定义,如用户界面和安全规则,实际是存储在对应数据表中的数据记录.模块中的 XML 和 CSV 文件不是 Odoo 应用运行时使用,而是载入数据表的手段.正是因为这个原因,Odoo ...
- 使用vuex来管理数据
最近一直工作比较忙,博客已经鸽了好久了,趁着今天是周末,写点东西吧 使用vuex来管理数据 最近一直在用vue做项目,但是却从来没真正去用过vuex,因为一直感觉很复杂,其实真正去研究一下啊,就会发现 ...
- 手写Vuex源码
Vuex原理解析 Vuex是基于Vue的响应式原理基础,所以无法拿出来单独使用,必须在Vue的基础之上使用. 1.Vuex使用相关解析 main.js import store form './s ...
- java实现二叉树的Node节点定义手撕8种遍历(一遍过)
java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...
- Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上
前言 诞生及优势 MQTT由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,现为Cirrus Link)于1999年开发,用于监测穿越沙漠的石油管道.目标 ...
- 【Python入门只需20分钟】从安装到数据抓取、存储原来这么简单
基于大众对Python的大肆吹捧和赞赏,作为一名Java从业人员,我本着批判与好奇的心态买了本python方面的书<毫无障碍学Python>.仅仅看了书前面一小部分的我......决定做一 ...
- 手撕RPC框架
手撕RPC 使用Netty+Zookeeper+Spring实现简易的RPC框架.阅读本文需要有一些Netty使用基础. 服务信息在网络传输,需要讲服务类进行序列化,服务端使用Spring作为容器.服 ...
随机推荐
- CSS:粘性定位 使正文标题置顶
案例效果 关键代码 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- MYSQL中JSON类型介绍
1 json对象的介绍 在mysql未支持json数据类型时,我们通常使用varchar.blob或text的数据类型存储json字符串,对mysql来说,用户插入的数据只是序列化后的一个普通的字符串 ...
- Trino418版本动态加载catalog不需要重启集群修改思路及实现
熟悉Trino 的同学应该都知道Trino新增.删除 catalog 都需要重启集群,这个生产环境里如果需要频繁增加数据源的场景是非常不友好的操作. 网上关于动态加载Catalog ...
- 知识图谱(Knowledge Graph)- Neo4j 5.10.0 Desktop & GraphXR 连接自建数据库
#输入查看数据库连接 neo4j$ :server status 添加 远程连接,输入连接地址 Graph Apps 选择 GraphXR 打开 显示
- 反汇编ARM程序的技术靠谱吗?——揭秘ARM架构二进制程序的反汇编技术现状
本文系原创,转载请说明出处 Please Subscribe Wechat Official Account:信安科研人,获取更多的原创安全资讯 参考发表在2020年软工顶会ISSTA的论文&l ...
- Controller 层代码技巧
Controller 层代码技巧 前言 本篇主要要介绍的就是controller层的处理,一个完整的后端请求由4部分组成: 接口地址(也就是URL地址) 请求方式(一般就是get.post,当然还有p ...
- 搭建 QT6+OpenCv4.7+CMake的环境
本文主要介绍如何搭建QT6+OpenCv的开发环境,基本流程如下 先安装CMake3.27.3,用来编译适用用QT的OpenCv的源码,安装完成后要配置系统的环境变量 安装Qt6的开发环境,并配置环境 ...
- Mysql高级11-后台进程
一.前言 MySQL的服务实现通过后台多个线程.内存池.文件交互来实现对外服务的,不同线程实现不同的资源操作,各个线程相互协助,共同来完成数据库的服务.MySQL常用的后台线程概括如下,分为Maste ...
- Teamcener AWC Solr链接被拒
1.检查安装Solr安装情况 2.在tem上勾选添加 安装完成后,总共有2个文件夹需要注意,一个 solr-版本 的文件夹,一个 TcFTSindexer 的文件夹 如果是solr安装的是服务,则不需 ...
- Azure Data Factory(九)基础知识回顾
一,引言 在本文中,我们将继续了解什么是 Azure Data Factory,Azure Data Factory 的工作原理,Azure Data Factory 数据工程中的数据管道,并了解继承 ...