Vuex学习二:Vuex的重点属性学习,state、mutations、getters、actions、module。

简介: 这篇文章是关于Vuex状态管理库的深入学习,涵盖了其核心概念如state、getters、mutations、actions和modules,并通过实例代码展示了它们的使用和重要性。

前言

一、State单一状态树

  • Vuex提出使用单一状态树, 什么是单一状态树呢?
    英文名称是Single Source of Truth,也可以翻译成单一数据源。
  • 但是,它是什么呢?我们来看一个生活中的例子。
  1. OK,我用一个生活中的例子做一个简单的类比。
  2. 我们知道,在国内我们有很多的信息需要被记录,比如上学时的个人档案,工作后的社保记录,公积金记录,结婚后的婚姻信息,以及其他相关的户口、医疗、文凭、房产记录等等(还有很多信息)。
  3. 这些信息被分散在很多地方进行管理,有一天你需要办某个业务时(比如入户某个城市),你会发现你需要到各个对应的工作地点去打印、盖章各种资料信息,最后到一个地方提交证明你的信息无误。
  4. 这种保存信息的方案,不仅仅低效,而且不方便管理,以及日后的维护也是一个庞大的工作(需要大量的各个部门的人力来维护,当然国家目前已经在完善我们的这个系统了)。
  • 这个和我们在应用开发中比较类似:
  1. 如果你的状态信息是保存到多个Store对象中的,那么之后的管理和维护等等都会变得特别困难。
  2. 所以Vuex也使用了单一状态树来管理应用层级的全部状态。
  3. 单一状态树能够让我们最直接的方式找到某个状态的片段,而且在之后的维护和调试过程中,也可以非常方便的管理和维护。
  • 说白了 建一个 store 就行,

二、Getters基本使用

1. 描述和案例

getters 类似于 vuecomputed
有时候,我们需要从store中获取一些state变异后的状态,比如下面的Store中:

  1. 返回 counter 的平方
  2. 获取学生年龄大于20的个数。
  3. 学生年龄大于20 的长度
  4. 传入自定义年龄 ,返回大于传入年龄的 数据

我们可以在Store中定义getters

2. 案例代码

  1. app.vue

  2. store/index.js

  3. HelloVuex.vue

  4. 效果

三、Mutations

1. Mutations状态更新

  • Vuex的store状态的更新唯一方式:提交Mutation
  • Mutation主要包括两部分:
  1. 字符串的 事件类型(type)
  2. 一个 回调函数(handler),该回调函数的第一个参数就是state。
  • mutation的定义方式:(在store/index.js)

  • 通过mutation更新(app.vue/methods)

2. Mutations传递参数

i、概念

  • 在通过 mutations 更新数据的时候, 有可能我们希望携带一些额外的参数
    参数被称为是mutations的载荷(Payload)

  • 但是如果参数不是一个呢?

  1. 比如我们有很多参数需要传递.
  2. 这个时候, 我们通常会以对象的形式传递, 也就是 payload 是一个对象.
  3. 这个时候可以再从对象中取出相关的信息。

ii、代码示例

  1. app.vue

  2. store/index.js

  3. 效果

3. Mutations提交风格

  • 其实上面2.2.2的代码案例中,已经写出了两种提交风格,我这里截图对比一下即可:
  • Mutation中的处理方式是将整个commit的对象作为payload使用, 所以代码没有改变

4. Mutations响应规则

i、概念

  • 响应式界面和数据同时改变。
  • Vuex的 store 中的 state 是响应式的, 当 state中的数据发生改变时, Vue组件会自动更新.
  • 这就要求我们必须遵守一些Vuex对应的规则:
  1. 提前在store中初始化好所需的属性.
  2. 当给state中的对象添加新属性时, 使用下面的方式:
    方式一: 使用Vue.set(obj, ‘newProp’, 123)
    方式二: 用新对象给旧对象重新赋值
  • 我们来看一个例子:
    当我们点击更新信息时, 界面并没有发生对应改变.
  • 如何才能让它改变呢?
  1. 查看下面代码的方式一和方式二
  2. 都可以让state中的属性是响应式的.

ii、代码案例

  1. app.vue
  2. store/index.js 认真看注释,很清晰,很清楚
  3. 效果

5. Mutations常量类型

i、概念

  • 我们来考虑下面的问题:
  1. 在mutation中, 我们定义了很多事件类型(也就是其中的方法名称).
  2. 当我们的项目增大时, Vuex管理的状态越来越多, 需要更新状态的情况越来越多, 那么意味着Mutation中的方法越来越多.
  3. 方法过多, 使用者需要花费大量的经历去记住这些方法, 甚至是多个文件间来回切换, 查看方法名称, 甚至如果不是复制的时候, 可能还会出现写错的情况.
  • 如何避免上述的问题呢?
  1. 在各种Flux实现中, 一种很常见的方案就是使用常量替代Mutation事件的类型.
  2. 我们可以将这些常量放在一个单独的文件中, 方便管理以及让整个app所有的事件类型一目了然.
  • 具体怎么做呢?
  1. 我们可以创建一个文件: mutation-types.js, 并且在其中定义我们的常量.
  2. 定义常量时, 我们可以使用ES2015中的风格, 使用一个常量来作为函数的名称.

ii、代码示例

其实就是将 app.vue 中的 commit 的方法字符串,写成常量,单独放到一个js文件,在 vuex 的store/index.js 中的 mutations 的方法也改成刚才的常量,这样就不会出现名称对不上而出现的问题。

  1. 在store下新建文件:mutations-types.js
  2. app.vue
  3. store/index.js
  4. 效果正常显示。

6. Mutations同步函数

  • 通常情况下, Vuex要求我们Mutation中的方法必须是同步方法.
  1. 主要的原因是当我们使用devtools时, 可以devtools可以帮助我们捕捉mutation的快照.
  2. 但是如果是异步操作, 那么devtools将不能很好的追踪这个操作什么时候会被完成.
  • 比如我们之前的代码, 当执行更新时, devtools中会有如下信息:

  • 但是, 如果Vuex中 mutations 的代码, 我们使用了异步函数:如下截图所示

  • 你会发现state中的info数据一直没有被改变, 因为他无法追踪到. 其实已经改变了,只不过无法监控到

  • So, 通常情况下, 不要再mutation中进行异步的操作

四、Action的基本定义

1. 概念

  • 我们强调, 不要再Mutation中进行异步操作.
  1. 但是某些情况, 我们确实希望在Vuex中进行一些异步操作, 比如网络请求, 必然是异步的. 这个时候怎么处理呢?
  2. Action类似于Mutation, 但是是用来代替Mutation进行异步操作的.
  • Action的基本使用代码如下:
  • context是什么?
  1. context是和store对象具有相同方法和属性的对象.
  2. 也就是说, 我们可以通过context去进行commit相关的操作, 也可以获取context.state等.
  3. 但是注意, 这里它们并不是同一个对象, 为什么呢? 我们后面学习Modules的时候, 再具体说.
  • 这样的代码是否多此一举呢?
  1. 我们定义了actions, 然后又在actions中去进行commit, 这不是脱裤放屁吗?
  2. 事实上并不是这样, 如果在Vuex中有异步操作, 那么我们就可以在actions中完成了.
  • 在Vue组件中, 如果我们调用action中的方法, 那么就需要使用dispatch,同样的, 也是支持传递payload

2. 代码示例

还是以修改用户信息为例:只修改 app.vue 中的 updateStudent 方法和 只添加 store/index.jsactions 方法即可。

  1. app.vue

  2. store/index.js

  3. 效果

五、modules

1. 描述

  • Module是模块的意思, 为什么在Vuex中我们要使用模块呢?
  1. Vue使用单一状态树,那么也意味着很多状态都会交给Vuex来管理.
  2. 当应用变得非常复杂时,store对象就有可能变得相当臃肿.
  3. 为了解决这个问题, Vuex允许我们将store分割成模块(Module), 而每个模块拥有自己的state、mutations、actions、getters等。
  • 我们按照什么样的方式来组织模块呢?
    我们来看下边的代码

2. Modules局部状态

  • 上面的代码中, 我们已经有了整体的组织结构, 下面我们来看看具体的局部模块中的代码如何书写.
  1. 我们在moduleA中添加state、mutations、getters
  2. mutations 和 getters接收的第一个参数是 局部状态对象

  • 注意:
  1. 虽然, 我们的doubleCount和increment都是定义在对象内部的.
  2. 但是在调用的时候, 依然是通过this.$store来直接调用的.

3. Actions的写法

actions的写法呢? 接收一个context参数对象
局部状态通过 context.state 暴露出来,根节点状态则为 context.rootState

如果getters中也需要使用全局的状态, 可以接受更多的参数

4. 代码示例

  1. app.vue

  2. store/index.js

  3. 效果

六、对象的解构:对象小技巧

七、项目结构抽取

写完上面的代码时,store/index.js 已经有了200多行代码了,这里需要将 mutations、getters、actions、module进行抽取出来;state 就不用抽取了,便于方面查看。

这样就清晰多啦

八、总结

到此 vuex 可以说就学习完了。
书山有路勤为径,学海无涯苦作舟
加油,为了未来更好的生活。

相关文章
|
存储 运维 数据挖掘
技术干货:腾讯云为什么选择磁带库?
随着全球冷数据的持续爆炸,以及磁带介质数据密度提升的巨大潜力,磁带库的前景充满想象力。这篇文章讲述了磁带库在腾讯大规模落地的技术故事。
2453 0
|
JavaScript 前端开发 Go
动态加载与异步加载 JavaScript 详解:加载远程js,加载成功后执行回调函数
动态加载与异步加载 JavaScript 详解:加载远程js,加载成功后执行回调函数
2388 2
|
3月前
|
存储 JavaScript 前端开发
务必把握Map对象在JavaScript循环中的使用细节
由于Map对象跟传统的对象类似,但提供了更多的迭代功能,它被广泛用来代替Object存储键值对。适当的使用Map和配套的迭代方法,可以让代码更加清晰,提高数据操作的灵活性和效率。在数据量大或者对迭代顺序有特定需求时,Map会是一个很好的选择。
111 0
|
JSON 前端开发 JavaScript
vite中静态资源(css、img、svg等)的加载机制及其相关配置
【8月更文挑战第3天】vite中静态资源(css、img、svg等)的加载机制及其相关配置
1401 1
|
12月前
|
JavaScript 前端开发 Java
VUE学习四:前端模块化,ES6和ES5如何实现模块化
这篇文章介绍了前端模块化的概念,以及如何在ES6和ES5中实现模块化,包括ES6模块化的基本用法、默认导出与混合导出、重命名export和import,以及ES6之前如何通过函数闭包和CommonJS规范实现模块化。
408 0
VUE学习四:前端模块化,ES6和ES5如何实现模块化
|
存储 前端开发 Java
Element el-upload 文件上传/图片上传/拖拽上传/附带参数/附带请求头部详解
文目录 1. 前言 2. 基本用法 2.1 前端部分 2.2 后端部分 2.3 获取后端返回信息 3. 外观功能介绍 3.1 拖拽上传 3.2 显示图片 3.3 设置文件列表样式 3.4 显示提示信息 4. 事件功能介绍 4.1 限制上传文件数量 4.2 限制上传文件类型和大小 4.3 移除文件处理 4.4 手动上传 5. 附带参数 6. 附带请求头部 7. 小结
7223 0
|
12月前
|
Linux
linux/mac 下查看、修改文件权限的命令
这篇文章介绍了在Linux和Mac操作系统下如何查看和修改文件及文件夹的权限。
594 0
|
12月前
|
弹性计算 安全 API
HTTP 405 Method Not Allowed:解析与解决
本文详细解析了HTTP 405 "Method Not Allowed" 错误,包括其定义、常见原因、示例代码及解决方案。通过检查API文档、修改请求方法或更新服务器配置,可有效解决此错误,提升Web开发效率。
6090 2
|
12月前
|
缓存 JavaScript 前端开发
vue-router学习二:动态路由(路由传递数据的一种方式),路由懒加载,嵌套路由,路由传递参数方式,导航守卫,keep-alive标签
这篇文章主要介绍了Vue Router的高级用法,包括动态路由、路由懒加载、嵌套路由、路由参数传递、导航守卫以及keep-alive的使用。
554 0
vue-router学习二:动态路由(路由传递数据的一种方式),路由懒加载,嵌套路由,路由传递参数方式,导航守卫,keep-alive标签
|
12月前
|
移动开发 前端开发 JavaScript
vue-router学习一:什么是路由,路由分类,路由安装,路由使用,路由默认路径,history模式,默认的linkActiveClass属性,路由代码跳转
这篇文章是关于Vue.js官方路由管理器vue-router的详细介绍,包括路由的基本概念、分类、安装、使用以及在单页面应用中的路由模式和跳转方法。
797 0
vue-router学习一:什么是路由,路由分类,路由安装,路由使用,路由默认路径,history模式,默认的linkActiveClass属性,路由代码跳转