前言

好,经过上一篇的介绍,实现了 Vuex 当中的 actions 方法,接下来我们来实现 Vuex 当中的模块化共享数据(modules)。

modules 方法用于模块化共享数据,那么什么叫模块化共享数据呢?其实非常简单。

过去我们将所有模块的数据都放到 state 中共享,例如:

我们有三个模块 首页 / 个人中心 / 登录,那么我们就会将这三个模块的数据都放到 state 中,但是这样会导致命名匮乏的问题。

比如说首页中需要共享name, 个人中心中也需要共享name / 登录中也需要共享name,并且这三个name的取值还不一样, 那么为了能把这三条数据放到同一个state中, 我们就必须指定不同的名称, 例如:

state:{
homeName: 'www',
accountName: 'BNTang',
loginName: 'top'
}

这样就会导致命名匮乏的问题,而且如果我们的项目足够大,那么我们的 state 中就会有很多的数据,这样就会导致我们的 state 中的数据非常多,而且不好管理。

为了解决这个问题,Vuex 就推出了模块化共享数据的方法,那么什么叫模块化共享数据呢?模块化共享数据就是将不同模块的数据放到不同的模块(state)中,这个就是模块化共享数据。

那么模块化共享数据怎么做呢,我们先不要管怎么做,我们先来看看模块化共享数据的好处。

我们还是拿上面的例子来说,我们有三个模块 首页 / 个人中心 / 登录,那么我们就会将这三个模块的数据都放到 state 中,但是这样会导致命名匮乏的问题。

好,到这里我们已经知道了模块化共享数据的好处,我们先来用一下模块化共享数据。

我先不管三七二十一,我在 Store 对象的 store 中定义了一个全局的数据 globalName 取值为 BNTang,

定义完毕之后呢,这个 globalName 代表着全局的数据,那么我们就可以在任何一个模块当中使用这个数据,那么接下来怎么办,例如这个时候我有两个模块分别是首页与个人中心,这两个模块中分别有一个 name 数据,这两个 name 该如何做呢,好我先写代码再来解释。

let home = {
state: {
name: '首页'
},
getters: {},
mutations: {},
actions: {}
}

如上的代码和 Store 中有一套相同的结构,这个对象中保存着首页的 name,保存完毕了之后,还没添加到 Store 中,那么如何添加到 Store 中呢,其实很简单,我们只需要在 Store 中的 modules 中添加这个模块就可以了。

modules: {
home: home
}

如上代码的写法就代表着,我们 Store 除了保存了全局的共享数据以外还保存了首页模块的共享数据,那么我们的个人中心数据该如何做呢,其实也是一样的(也是同一个世界,同一个梦想的),我们来写一个个人中心的模块。

let account = {
state: {
name: '账户'
},
getters: {},
mutations: {},
actions: {}
}

然后将这个模块添加到 Store 中,方式和上面一样。

modules: {
home: home,
account: account
}

好了,到这里我们已经定义了全局共享的数据,与各个模块的共享数据,我们保存归保存,但是我们怎么使用呢,我们来看看。

拿全局共享的数据(随机找一个组件展示数据即可):

<p>{{ this.$store.state.globalName }}</p>

拿首页的共享数据(随机找一个组件展示数据即可):

<p>{{ this.$store.state.home.name }}</p>

拿个人中心的共享数据(随机找一个组件展示数据即可):

<p>{{ this.$store.state.account.name }}</p>

测试效果我不贴图了本人亲自测试过,有个 注意点,我们的 Nuex 还没有实现模块化,所以在测试的时候记得将自己实现的 Nuex 注释掉,打开官方的 Vuex。

到这里,我们的页面就已经展示了全局共享数据与模块化共享数据,完成了将不同模块的数据放到不同的模块(state)中,这个就是模块化共享数据。

模块化中 getters/mutations/actions 的使用

我们知道在 Store 当中,我们可以使用 getters/mutations/actions 这三个方法,那么这三个方法在模块化当中是怎么使用的呢,先看全局的,在全局 Store 分别在这三个方法中定义方法,如下:

getters: {
getGlobalName(state) {
return state.globalName + '111111';
}
},
mutations: {
changeGlobalName(state, payload) {
state.globalName += payload;
}
},
actions: {
asyncChangeGlobalName({commit}, payload) {
setTimeout(() => {
commit('changeGlobalName', payload);
}, 1000);
}
},

内容非常的简单,如果是从之前的文章一步一步跟着来的再看如上的代码基本上没有什么压力(我这里不做过多的解释,因为前面讲解的很细,不懂的可以回去翻看之前章节的介绍),然后我们在组件当中使用这三个方法,如下:

<template>
<div class="hello">
<p>{{ this.$store.state.globalName }}</p>
<p>{{ this.$store.getters.getGlobalName }}</p>
<button @click="globalFn1">同步操作</button>
<button @click="globalFn2">异步操作</button>
</div>
</template> <script>
export default {
name: 'HelloWorld',
methods: {
globalFn1() {
this.$store.commit('changeGlobalName', 10);
},
globalFn2() {
this.$store.dispatch('asyncChangeGlobalName', 5);
}
}
}
</script>
<style scoped>
</style>

关于测试自行测试,这里不做过多的解释(运行项目,点击页面上面的按钮即可查询效果)。

好了这里我们已经知道了全局的 getters/mutations/actions 的使用,那么模块化当中的 getters/mutations/actions 的使用又是怎么样的呢,我们来看看。

我先不管三七二十一,我在 home 模块中的 getters/mutations/actions 中定义方法,如下:

首页模块:

getters: {
getHomeName(state) {
return state.name + '222222';
}
},
mutations: {
changeHomeName(state, payload) {
state.name += payload;
}
},
actions: {
asyncChangeHomeName({commit}, payload) {
setTimeout(() => {
commit('changeHomeName', payload);
}, 1000);
}
}

我这个时候想,我在全局 Store 的 getters/mutations/actions 方法中定义了方法,可以和之前的方式一样使用,那么在模块中的 getters/mutations/actions 方法中定义了方法,我能不能和之前的方式一样使用呢,我们来看看。

首先展示首页模块中的 name, 如果这里直接和之前一样的写法肯定是不能展示的,所以这里我就要提到一个注意点:如果获取的是模块中state共享的数据, 那么需要加上模块的名称

知道了这个注意点之后,我们的代码就可以改写为如下的方式来展示模块中 store 存储的数据,代码如下:

<p>{{ this.$store.state.home.name }}</p>

上面这一点是我们在使用模块化共享数据的时候需要注意的,与寻常的使用方式不同,需要加上模块的名称。

那么我们从 getters/mutations/actions 中获取数据呢,如果获取的是模块中getters共享的数据, 那么不需要加上模块的名称,代码如下:

<p>{{ this.$store.getters.getHomeName }}</p>

mutation 与 action 与使用全局的方式一样,不需要加上模块的名称, 在页面编写两个按钮,一个是同步,一个是异步,在分别实现下各个按钮的点击事件即可, 代码如下:

添加按钮:

<button @click="homeFn1">同步操作</button>
<button @click="homeFn2">异步操作</button>

实现方法:

homeFn1() {
this.$store.commit('changeHomeName', 10);
},
homeFn2() {
this.$store.dispatch('asyncChangeHomeName', 5);
}

好了,我们首页模块的 getters/mutations/actions 的使用代码编写好了,我们赶紧趁热来测试一下,看看我们的代码是否能够正常的运行,打开浏览器点击按钮即可完成测试我这里略过。

首页模块的我们编写完毕了,接着来编写个人中心模块的 getters/mutations/actions 的使用,其实和首页模块的 getters/mutations/actions 的使用是一样的,我们来看看,为了节约时间,我直接贴代码:

个人中心模块:

let account = {
state: {
name: '账户'
},
getters: {
getAccountName(state) {
return state.name + '333333';
}
},
mutations: {
changeAccountName(state, payload) {
state.name += payload;
}
},
actions: {
asyncChangeAccountName({commit}, payload) {
setTimeout(() => {
commit('changeAccountName', payload);
}, 1000);
}
}
}

页面展示:

<p>{{ this.$store.state.account.name }}</p>
<p>{{ this.$store.getters.getAccountName }}</p>
<button @click="accountFn1">同步操作</button>
<button @click="accountFn2">异步操作</button>

实现方法:

accountFn1() {
this.$store.commit('changeAccountName', 10);
},
accountFn2() {
this.$store.dispatch('asyncChangeAccountName', 5);
}

好了,到这里我们的模块化当中的 getters/mutations/actions 的使用就已经完成了。

其实除了在全局的 Store 中添加子模块,子模块还可以添加模块,可以无限的这样添加模块,例如我现在有一个登陆模块,我将登陆模块添加到 account 模块中,登陆模块的代码如下:

let login = {
state: {
name: '登录'
},
getters: {
getLoginName(state) {
return state.name + '333333';
}
},
mutations: {
changeLoginName(state, payload) {
state.name += payload;
}
},
actions: {
asyncChangeLoginName({commit}, payload) {
setTimeout(() => {
commit('changeLoginName', payload);
}, 1000);
}
}
}

然后将登陆模块添加到 account 模块中,代码如下:

modules: {
login: login
}

然后我们在页面中展示登陆模块的数据,代码如下:

<p>{{ this.$store.state.account.login.name }}</p>
<p>{{ this.$store.getters.getLoginName }}</p>

展示数据的注意点与之前一样,需要加上模块的名称,而 getters 就不需要加上模块的名称,然后我们在页面中调用登陆模块的 mutations/actions 的方法,代码如下:

首先是触发按钮:

<button @click="loginFn1">同步操作</button>
<button @click="loginFn2">异步操作</button>

然后是实现方法:

loginFn1() {
this.$store.commit('changeLoginName', 10);
},
loginFn2() {
this.$store.dispatch('asyncChangeLoginName', 5);
}

好了,到这里我们的模块化的使用就已经完成了,我们赶紧来测试一下,看看我们的代码是否能够正常的运行,打开浏览器点击按钮即可完成测试我这里略过。

手撕Vuex-模块化共享数据上的更多相关文章

  1. Vuex入门实践(上)

    一.前言 vuex被称为是专为vue应用程序开发的的状态管理模式.它的作用使用一句话描述就是:让组件之间可以共享数据 话不多少,先抛开概念,我们写一个简单的示例感受一波. 二.项目开发环境 项目开发环 ...

  2. vuex数据管理-数据模块化

    对于vue这类mvvm框架来说,其核心就是组件与数据,因此做好相应的数据管理极为重要.这里分享下vuex数据模块化管理的方法,有利于搭建便于维护.协作的vue项目. vuex管理基本方法和使用 模块化 ...

  3. Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上

    前言 诞生及优势 MQTT由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,现为Cirrus Link)于1999年开发,用于监测穿越沙漠的石油管道.目标 ...

  4. Vue总结第六天:Vuex (全局变量管理~多个页面共享数据)

    Vue总结第六天:Vuex (全局变量管理~多个页面共享数据) 目录 一.Vuex (全局变量管理~~多个页面共享数据) ✿ 更详细的可以看官网:开始 | Vuex 1.什么是Vuex? 2.核心概念 ...

  5. MySQL通过bin log日志恢复数据|手撕MySQL|对线面试官

    关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第二篇文章,今天介绍一下MySQL的二进制日志(bin log),注意不要和MySQL的InnoDB ...

  6. Vuex 模块化与项目实例 (2.0)

    Vuex 强调使用单一状态树,即在一个项目里只有一个 store,这个 store 集中管理了项目中所有的数据以及对数据的操作行为.但是这样带来的问题是 store 可能会非常臃肿庞大不易维护,所以就 ...

  7. 手撕RPC框架

    手撕RPC 使用Netty+Zookeeper+Spring实现简易的RPC框架.阅读本文需要有一些Netty使用基础. 服务信息在网络传输,需要讲服务类进行序列化,服务端使用Spring作为容器.服 ...

  8. NN入门,手把手教你用Numpy手撕NN(一)

    前言 这是一篇包含极少数学推导的NN入门文章 大概从今年4月份起就想着学一学NN,但是无奈平时时间不多,而且空闲时间都拿去做比赛或是看动漫去了,所以一拖再拖,直到这8月份才正式开始NN的学习. 这篇文 ...

  9. NN入门,手把手教你用Numpy手撕NN(2)

    这是一篇包含较少数学推导的NN入门文章 上篇文章中简单介绍了如何手撕一个NN,但其中仍有可以改进的地方,将在这篇文章中进行完善. 误差反向传播 之前的NN计算梯度是利用数值微分法,虽容易实现,但是计算 ...

  10. NN入门,手把手教你用Numpy手撕NN(三)

    NN入门,手把手教你用Numpy手撕NN(3) 这是一篇包含极少数学的CNN入门文章 上篇文章中简单介绍了NN的反向传播,并利用反向传播实现了一个简单的NN,在这篇文章中将介绍一下CNN. CNN C ...

随机推荐

  1. python添加水印

    # coding:utf-8 from PIL import Image, ImageDraw, ImageFont def add_text_to_image(image, text): font ...

  2. 学习LVM:archive 和 backup目录

    推荐文档:Logical Volume Manager Administration 在掌握了基本的commands操作后,你是否对操作背后的一些东西产生好奇呢? 程序的configure一般会提供这 ...

  3. 2021-7-30 MySql函数的使用归类整理

    Mysql字符的使用 SELECT ASCII(user_password) as 阿斯克码 FROM users;#返回首字符的ascii码 SELECT CHAR_LENGTH(user_pass ...

  4. 第十六届全国大学生 信息安全竞赛创新实践能力赛wp

    这是我第一次参加ctf,有许多东西都还不会,感觉有一些题挺有趣的,多积累积累经验吧. crypto Sign_in_passwd 下发了一个叫flag的文件,用记事本打开发现是两行加密,第一行看着像b ...

  5. Redis从入门到放弃(5):事务

    1.事务的定义 Redis的事务提供了一种"将多个命令打包, 然后一次性.按顺序地执行"的机制. redis事务的主要作用就是串联多个命令防止别的命令插队. 但是,事务并不具有传统 ...

  6. 【高并发】SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏)

    大家好,我是冰河~~ 首先问下大家:你使用的SimpleDateFormat类还安全吗?为什么说SimpleDateFormat类不是线程安全的?带着问题从本文中寻求答案. 提起SimpleDateF ...

  7. 从原理聊JVM(四):JVM中的方法调用原理

    1 引言 多态是Java语言极为重要的一个特性,可以说是Java语言动态性的根本,那么线程执行一个方法时到底在内存中经历了什么,JVM又是如何确定方法执行版本的呢? 2 栈帧 JVM中由栈帧存储方法的 ...

  8. 【go笔记】目录操作

    基本目录操作 涉及:创建目录.重命名目录.删除目录 package main import ( "fmt" "os" "time" &quo ...

  9. C#性能优化-树形结构递归优化

    前言 大家好,我是wacky,最近在工作中遇到一个有趣的问题,同事反馈说WPF中有一个树形结构的集合,在加载时会直接报堆栈溢出,一直没时间(懒得)看,导致很久了也没人解决掉.于是,组长就把这个&quo ...

  10. 如何在工作中利用Prompt高效使用ChatGPT?

    导读 AI 不是来替代你的,是来帮助你更好工作.用better prompt使用chatgpt,替换搜索引擎,让你了解如何在工作中利用Prompt高效使用ChatGPT. 01背景 现在 GPT 已经 ...