当前位置:首页 > 编程技术 > 正文内容

Vuex 3.x 状态管理模式

yc8882年前 (2022-12-21)编程技术282

1. Vuex 介绍


Vuex 官网: https://vuex.vuejs.org/zh

Vuex 的最新版是 Vuex 4.x 【当前时间 2022-10】

Vue 3 使用 Vuex 4,而 Vue 2 使用 Vuex 3,本文记录的是 Vuex3 的使用总结,Vuex 3.x 文档

一、组件之间共享数据的方式:

父向子传值: v-bind 属性绑定,子向父传值: v-on 事件绑定

二、那么页面之间如何共享数据呢 ?这就需要使用到 vuex 了

vuex 可以实现多个组件中共享状态(数据)

官方解释: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式

换句话说,vuex 是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享

三、Vuex 术语

在 vuex 中,状态指的是共享的数据,也就是 vuex 的 state 的值

四、使用 vuex 统一管理状态的好处

a. 高效的实现数据共享,提高开发效率
b. 集中管理共享的数据,易于开发和后期维护
c. 存储在 vuex 中的数据都是响应式的,能够实时保持数据与页面的同步

2. Vuex 安装


将 vuex 安装为 运行时依赖【本文章默认项目环境为 vue 脚手架】

vue 脚手架需要安装该依赖,而 uniapp 项目已经内置 vuex,无需安装即可直接使用

  1. npm install vuex --save

创建文件: src/store/index.js, 文件内容如下:

  1. import Vue from 'vue';
  2. import Vuex from 'vuex';
  3. // 1. 安装插件
  4. Vue.use(Vuex)
  5. // 2. 创建对象
  6. const store = new Vuex.Store({
  7. })
  8. // 3. 导入 store 对象
  9. export default store

在 main.js 中导入 store 对象,并将 store 对象挂载到 vue 实例上

  1. import store from './store'
  2. new Vue({
  3. el: '#app',
  4. store,
  5. render: h => h(App)
  6. })

3. Vue.js devtools 插件


多个界面修改 vuex 状态时,这个工具会对状态进行跟踪,当出现问题时,可以更好的调试错误

4. state 数据的访问方式


方法一:通过 vue 实例访问

因为将 vuex 挂载到了 vue 实例中,所以 vuex 的数据可以通过 vue 实例访问

  1. this.$store.state

方法二:使用 mapState 函数将 vuex 数据映射为计算属性

  1. // 1. 从 vuex 中按需导入 mapState 函数
  2. import { mapState } from 'vuex';
  3. // 2. 使用 mapState 函数将 vuex 数据映射为当前组件的计算属性 (computed)
  4. export default {
  5. computed: {
  6. ...mapState(['token', 'userInfo'])
  7. }
  8. }
  9. // 也可以这样写
  10. export default {
  11. computed: mapState(['token', 'userInfo'])
  12. }

5. getters 的使用详解


使用场景: 当某一个数据需要经过一系列的操作后再返回时,可以使用 getters 处理

Getter 用于对 Store 中的数据进行加工处理形成新的数据,类似 Vue 的计算属性(computed),起到一个包装器的作用,当 Store 中的数据发生变化时, Getter 的数据也会跟着变化

getters 方法定义:

  1. const store = new Vuex.Store({
  2. state: {
  3. counter: 6
  4. },
  5. getters: {
  6. power(state) {
  7. return state.counter * state.counter
  8. }
  9. }
  10. })

调用 getters 的两种方式

方式一、使用 this.$store.getters.名称 调用 getters

  1. // 调用方式
  2. this.$store.getters.power
  3. // 在组件模板中调用
  4. {{ $store.getters.power }}

getters 的其他用法参考下方代码示例:

  1. {{ $store.getters.more20Stu }}
  2. {{ $store.getters.more20StuCount }}
  3. {{ $store.getters.moreAgeStu(20) }}
  1. const store = new Vuex.Store({
  2. state: {
  3. students: [
  4. { id: 1, name: "wang", age: 18 },
  5. { id: 2, name: "liang", age: 21 },
  6. { id: 3, name: "zhang", age: 30 },
  7. ],
  8. },
  9. getters: {
  10. more20Stu(state) {
  11. // 获取年龄大于20的
  12. return state.students.filter(s => s.age > 20)
  13. },
  14. more20StuCount(state, getters) {
  15. // 获取年龄大于20的个数
  16. return getters.more20Stu.length
  17. },
  18. moreAgeStu(state) {
  19. // 如果要传参数,需要返回一个函数
  20. return age => {
  21. return state.students.filter(s => s.age > age)
  22. }
  23. }
  24. }
  25. })

方式二、使用 mapGetters 将 getters 方法映射为当前组件的计算属性

  1. // 1. 从 vuex 中按需导入 mapGetters 函数
  2. import { mapGetters } from 'vuex';
  3. // 2. 使用 mapGetters 函数将 getters 方法映射为当前组件的计算属性 (computed)
  4. export default {
  5. computed: {
  6. ...mapGetters(['power', 'total'])
  7. }
  8. }

6. mutations 的使用详解


vuex 的 state 数据更新的唯一方式: 提交 Mutation

mutations 用于变更 store 中的数据。只能通过 mutations 变更 store 数据,不能直接操作 store 数据,这种方式虽然操作起来繁琐一些,但是可以集中监控所有数据的变化

mutation 主要包括两部分: 事件类型 (type)、回调函数 (handler)

mutation 的定义方式:
a. increment 称为事件类型,回调函数的第一个参数永远就是 state
b. mutations 中的方法第二个参数被称为 mutations 的载荷 (payload)

  1. {
  2. state: {
  3. counter: 1
  4. },
  5. mutations: {
  6. mutations: {
  7. increment(state) {
  8. state.counter++
  9. },
  10. decrement(state, num) {
  11. state.counter -= num
  12. },
  13. }
  14. }
  15. }

触发 mutation 的两种方式

方式一、使用 this.$store.commit 触发 mutations

  1. // commit 的作用就是调用某个 mutation 函数
  2. this.$store.commit("increment");//不需要参数
  3. this.$store.commit("decrement", num);//传参

通过 commit 进行提交是一种普通的提交方式,vue 还提供了另外一种风格,它是一个包含 type 属性的对象

  1. this.$store.commit({
  2. type: "add",
  3. num: 10,
  4. age: 20,
  5. });

此时要注意 mutation 中的方法的第二个参数的值,和普通提交方式可不一样

  1. add(state, payload) {
  2. console.log(payload) // {type: 'add', num: 10, age: 20}
  3. }

方式二、使用 mapMutations 将 mutations 函数映射为当前组件的 methods 方法

  1. // 1. 从 vuex 中按需导入 mapMutations 函数
  2. import { mapMutations, } from 'vuex';
  3. // 2. 使用 mapMutations 将 mutations 函数映射 methods 方法
  4. export default {
  5. methods: {
  6. ...mapMutations(['login', 'getUserInfo']),
  7. }
  8. }

7. actions 的使用详解


vuex 要求 mutations 中的方法体内容必须是同步操作

本站发布的内容若侵犯到您的权益,请邮件联系站长删除,我们将及时处理!


从您进入本站开始,已表示您已同意接受本站【免责声明】中的一切条款!


本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行研究。


本站资源仅供学习和交流使用,版权归原作者所有,请勿商业运营、违法使用和传播!请在下载后24小时之内自觉删除。


若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,使用者自行承担,概与本站无关。


本文链接:https://www.10zhan.com/biancheng/10258.html

标签: vue
分享给朋友:

“Vuex 3.x 状态管理模式” 的相关文章

【说站】laravel实现自定义404页面并给页面传值

【说站】laravel实现自定义404页面并给页面传值

以 laravel5.8 为例,虽然有自带的404页面,但太简单,我们更希望能自定义404页面,将用户留在站点。实现的方式很简单,将自定义的视图文件命名为 404.blade.php,并放到 reso...

【说站】用一句话就可以去除宝塔面板操作上的二次验证

【说站】用一句话就可以去除宝塔面板操作上的二次验证

用过宝塔的朋友应该都会发现,现在宝塔面板有些鸡肋的功能,删除文件、删除数据库、删除站点等操作都需要做计算题!不仅加了几秒的延时等待,还无法跳过!这时候就会有朋友在想,如何去除宝塔面板的二次验证,此篇文...

【说站】Centos8.0如何配置静态IP详解及永久关闭防火墙

【说站】Centos8.0如何配置静态IP详解及永久关闭防火墙

这篇文章主要介绍了详解Centos8 配置静态IP的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来学习一下!1. 查看自己的网关地址点击虚...

【说站】电脑安装MySQL时出现starting the server失败原因及解决方案

【说站】电脑安装MySQL时出现starting the server失败原因及解决方案

今天在安装MySQL时出现starting the server失败,经过查询分析得出以下结论,记录一下操作步骤。原因分析:如果电脑是第一次安装MySQL,一般不会出现这样的报错。如下图所示。star...

【说站】C#在PDF中添加墨迹注释Ink Annotation的步骤详解

【说站】C#在PDF中添加墨迹注释Ink Annotation的步骤详解

PDF中的墨迹注释(Ink Annotation),表现为徒手涂鸦式的形状;该类型的注释,可任意指定形状顶点的位置及个数,通过指定的顶点,程序将连接各点绘制成平滑的曲线。下面,通过C#程序代码介绍如何...

【说站】Java从resources读取文件内容的方法有哪些

【说站】Java从resources读取文件内容的方法有哪些

本文主要介绍的是java读取resource目录下文件的方法,比如这是你的src目录的结构├── main│ ├── java│ │ └── ...