首页 > 其他分享 >手撕Vuex-安装模块数据

手撕Vuex-安装模块数据

时间:2023-11-13 21:25:20浏览次数:30  
标签:arr Vuex length state 模块 安装 我们

前言

根据上一篇,【手写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 就是我们要安装的模块的数据。

好了,这篇文章我们主要是实现了安装模块的数据,下一篇文章将会实现安装模块的方法。

标签:arr,Vuex,length,state,模块,安装,我们
From: https://www.cnblogs.com/BNTang/p/17830208.html

相关文章

  • Linux 源码包安装
    SRPM包,比RPM包多了一个“S”,是“Source”的首字母,所以SRPM可直译为“源代码形式的RPM包”。也就是说,SRPM包中不再是经过编译的二进制文件,都是源代码文件。可以这样理解,SRPM包是软件以源码形式发布后直接封装成RPM包的产物。从表中可以看到,SRPM包的命名与RPM包基本类......
  • MT8788/MTK8788安卓核心板介绍_4G全网通安卓智能模块
    MT8788核心板是一款功能强大的4G全网通安卓智能模块。它采用联发科AIOT芯片平台,具有超高性能和低功耗的特点。该核心板搭载了12nm制程四个Cortex-A73+四个Coretex-A53处理器,最高主频可达2.0GHZ。内存方面,板载内存为4GB+64GB,同时也支持2GB+16GB和3GB+32GB的配置。图形方面,MT8788......
  • ES安装报错
    1.配置了日志启动失败由于权限问题导致启动失败,原因是我在elasticsearch/conf/elasticsearch.yml中设置了path.data和path.logs,ES启动建议使用普通用户启动,root权限过大,初期未给path.data和path.logs设置普通用户属组,导致启动失败。需要给配置的日志路劲设置用户组chown-Res......
  • TD支持的库:python库、自身的python库、已经内置但需要自行引用的第三方库、第三方以外
    这是内置的第三方库asn1crypto (asn1crypto)-ParsingandserializingASN.1structuresAuthlib (authlib)-LibrarytobuildOAuthandOpenIDConnectservers.Certifi (certifi)- Root CertificatesforvalidatingthetrustworthinessofSSLcertificateswhi......
  • macOs Catalina 10.15.7安装xcode
    iMac新装了系统(Catalina10.15.7)之后,安装git提示缺少xcode试了以下方法,都没有成功:1、执行 xcode-select--install,提示:requestedforcommandlinedevelopertools2、通过appstore下载xcode,提示:不能将Xcode安装在macOs上,因为需要macOsv13.5或更高版本 查询了网上的方法......
  • Python curlify 模块将请求对象转换为 cURL 命令
    一、curlify是一个Python模块,它可以将Python的requests库中的请求对象转换为cURL命令的形式。使用curlify可以方便地将Python代码中的请求转化为可执行的cURL命令,方便调试和测试。以下是curlify模块的简单使用步骤:安装curlify模块。可以使用pip命令进行......
  • vuejs3.0 从入门到精通——Vuex 4.x —— Getter
    Vuex4.x——Getterhttps://vuex.vuejs.org/zh/guide/getters.html 有时候我们需要从store中的state中派生出一些状态,例如对列表进行过滤并计数:computed:{doneTodosCount(){returnthis.$store.state.todos.filter(todo=>todo.done).length}} 如......
  • 常见光模块的封装类型有哪些?
    光模块的封装,保障了光通信的稳定和可靠性。本文介绍几种常见的光模块的封装类型。1×9封装–焊接型光模块,一般速度不高于千兆,多采用SC接口。SFP封装:SFP(Smallform-factorpluggable)意思是小型可拔插式。就是能够支持千兆以太网、SONET、光纤通道和其他通信标准,插入到交换机SFP端口......
  • vuejs3.0 从入门到精通——Vuex 4.x —— state
    Vuex4.x——statehttps://vuex.vuejs.org/zh/guide/state.html一、单一状态树 Vuex使用单一状态树——是的,用一个对象就包含了全部的应用层级状态。至此它便作为一个“唯一数据源(SSOT)”而存在。这也意味着,每个应用将仅仅包含一个store实例。单一状......
  • vuejs3.0 从入门到精通——Vuex
    Vuexhttps://vuex.vuejs.org/zh/一、Vue是什么? Vuex是一个专为Vue.js应用程序开发的状态管理模式+库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。1.1、什么是"状态管理模式"? 状态管理模式是一种在前端开发中管理......