vue重修之Vuex【上部】

文章目录

  • 版权声明
  • Vuex 概述
    • Vuex 的主要概念和组件
  • vuex的使用
  • 状态 (state)
    • Vuex特点
  • 访问vuex中数据
    • $store访问
    • mapState辅助函数访问
  • 开启严格模式及Vuex的单项数据流
  • 突变(mutations)
    • mutations初识
    • 带参 mutations
    • 辅助函数 mapMutations
  • 动作(Actions)
    • 辅助函数 mapActions
  • vuex mutations VS actions
  • 获取器(Getters)
  • 总结

版权声明

  • 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。
  • 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。
  • 若您是黑马程序员或相关权利人,如有任何侵犯版权的地方,请您及时联系我,我将立即予以删除或进行必要的修改。
  • 对于其他读者,请在阅读本博客内容时保持遵守相关法律法规和道德准则,谨慎参考,并自行承担因此产生的风险和责任。本博客中的部分观点和意见仅代表我个人,不代表黑马程序员的立场。

Vuex 概述

  • uex 是一个用于 Vue.js 的状态管理库【状态就是数据】。简言之,Vuex 是一个插件,可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。
  • 使用场景
    在这里插入图片描述

  • 优势
    • 共同维护一份数据,数据集中化管理
    • 响应式变化
    • 操作简洁
      在这里插入图片描述

Vuex 的主要概念和组件

  • 状态(State):Vuex 中的状态是存储应用程序数据的地方,通常表示为 JavaScript 对象。

  • 获取器(Getters):获取器用于根据当前状态计算派生状态类似于存储库中的计算属性。

  • 突变(Mutations):突变是修改状态的唯一方式。它们是同步的,通过明确定义状态如何改变,有助于维护可预测的状态。

  • 动作(Actions):动作用于执行异步操作和触发突变。适合进行诸如发出 API 请求然后根据结果提交突变等任务。

  • 模块(Modules):Vuex 允许将存储划分为模块。这对于较大的应用程序有助于将状态、突变、动作和获取器组织成更小、更可管理的部分。

  • Vuex 特别适用于较大的应用程序,其中状态管理可能变得复杂。

  • 它强制执行单向数据流,并使更容易跟踪应用程序状态变化的来源。这种可预测性有助于调试和维护不断增长的应用程序。

vuex的使用

  • Vue.js 应用程序中设置 Vuex 的一般步骤
    在这里插入图片描述
  1. 安装(Installation):你需要将 Vuex 安装为依赖项,可以使用 npm 或 yarn 进行安装。

    npm i vuex@3 # vue2适用
    
  2. 存储配置(Store Configuration):通过定义状态、突变、动作和获取器来创建一个存储。

    • 为了维护项目目录的整洁,在src目录下新建一个store目录其下放置一个index.js文件。
      在这里插入图片描述
       // store.jsimport Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({state: {// 在这里定义应用程序的状态},mutations: {// 在这里定义突变函数},actions: {// 在这里定义动作函数},getters: {// 在这里定义获取器函数}})export default store
    
  3. 在 main.js 中导入挂载到 Vue 实例上

    import Vue from 'vue'
    import App from './App.vue'
    import store from './store'Vue.config.productionTip = falsenew Vue({render: h => h(App),store
    }).$mount('#app')
    
  4. 测试打印Vuex

    created(){console.log(this.$store)
    }
    

状态 (state)

  • “state”(状态)是指应用程序中的数据的集合,通常表示为一个包含各种属性的 JavaScript 对象。这些属性可以包括应用程序的配置、用户信息、页面内容、各种设置等。
  • State提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储。
  • store 对象的 state 属性中定义应用程序的状态
const store = new Vuex.Store({// state 状态, 即数据, 类似于vue组件中的data,// 区别:// 1.data 是组件自己的数据, // 2.state 中的数据整个vue项目的组件都能访问到state: {user: null,settings: {theme: 'light',language: 'en',},// 其他应用程序状态},// 其他配置项
})

Vuex特点

  • Vuex 中状态的一些重要特点
    • Centralized: Vuex 中的状态是集中管理的,这意味着所有组件都可以访问相同的状态数据,而不需要通过复杂的组件传递数据来实现共享。

    • Reactive: Vuex 的状态是响应式的。当状态发生变化时,依赖于该状态的组件会自动更新以反映这些变化。

    • Read-Only: Vuex 的状态是只读的。这意味着你不能直接在组件中修改状态,而是需要通过 mutations 来进行修改。这有助于维护状态的可预测性。

    • Single Source of Truth: Vuex 鼓励将应用程序的状态集中到一个单一的状态树中,使其成为整个应用程序的“唯一数据源”。这有助于简化状态的管理和维护。

    • Predictable: 由于状态的修改只能通过 mutations 来进行,因此状态的变化变得可预测,易于调试和维护。

访问vuex中数据

  1. 通过$store直接访问 —> {{ $store.state.count }}
  2. 通过辅助函数mapState 映射计算属性 —> {{ count }}

$store访问

  • 通过$store访问的语法
    获取 store:1.Vue模板中获取 this.$store2.js文件中获取 import 导入 store模板中:     {{ $store.state.xxx }}
    组件逻辑中:  this.$store.state.xxx
    JS模块中:   store.state.xxx
    
  • 模板中使用
    • 在组件中访问 Vuex 中的状态,可以使用 this.$store.state 来获取状态的值
<template><div><p>User: {{ $store.state.user }}</p><p>Theme: {{ $store.state.settings.theme }}</p></div>
</template>
  • 组件逻辑中使用
    • 将state属性定义在计算属性中
    <h1>state的数据 - {{ count }}</h1>// 把state中数据,定义在组件内的计算属性中computed: {count () {return this.$store.state.count}}
    
  • js文件中使用
//main.jsimport store from "@/store"console.log(store.state.count)

mapState辅助函数访问

  • mapState是辅助函数,把store中的数据映射到 组件的计算属性中, 它属于一种方便的用法
    在这里插入图片描述
  • 第一步:导入mapState (mapState是vuex中的一个函数)
    import { mapState } from 'vuex'
    
  • 第二步:采用数组形式引入state属性
    mapState(['count']) 
    
    • 上面的代码等价于
    count () {return this.$store.state.count
    }
    
  • 第三步:利用展开运算符将导出的状态映射给计算属性
      computed: {...mapState(['count'])}<div> state的数据:{{ count }}</div>
    

开启严格模式及Vuex的单项数据流

  • vuex 同样遵循单向数据流,组件中不能直接修改仓库的数据
  1. 直接在组件中修改Vuex中state的值
    在这里插入图片描述
  • Son1.vue
button @click="handleAdd">+ 1</button>methods:{handleAdd (n) {// 错误代码(vue默认不会监测,监测需要成本)this.$store.state.count++// console.log(this.$store.state.count) },
}
  1. 开启严格模式
    • 通过 strict: true 可以开启严格模式,开启严格模式后,直接修改state中的值会报错
    • state数据的修改只能通过mutations,并且mutations必须是同步的
      在这里插入图片描述

突变(mutations)

mutations初识

  1. 定义mutations
const store  = new Vuex.Store({state: {count: 0},// 定义mutationsmutations: {}
})
  1. 格式说明
  • mutations是一个对象,对象中存放修改state的方法
mutations: {// 方法里参数 第一个参数是当前store的state属性// payload 载荷 运输参数 调用mutaiions的时候 可以传递参数 传递载荷addCount (state) {state.count += 1}}
  1. 组件中提交 mutations
this.$store.commit('addCount')

带参 mutations

  • 提交 mutation 是可以传递参数的 this.$store.commit('xxx', 参数)
  1. 提供mutation函数(带参数)
    mutations: {...addCount (state, count) {state.count = count}
    }
    
  2. 提交mutation
    handle ( ) {this.$store.commit('addCount', 10)
    }
    
  3. 小tips: 提交的参数只能是一个, 如果有多个参数要传, 可以传递一个对象
    this.$store.commit('addCount', {count: 10
    })
    

辅助函数 mapMutations

  • mapMutations 和 mapState很像,它是把位于mutations中的方法提取了出来,映射到组件methods中。
    import  { mapMutations } from 'vuex'
    methods: {...mapMutations(['addCount'])
    }
    //等价于
    methods: {// commit(方法名, 载荷参数)addCount () {this.$store.commit('addCount')}
    }
    
    • 在组件中,可以直接通过this.addCount调用
    <button @click="addCount">+1</button>
    
  • 请注意: Vuex中mutations中要求不能写异步代码,如果有异步的ajax请求,应该放置在actions中

动作(Actions)

  • actions是用于处理异步操作的,例如从服务器获取数据或执行复杂的计算。Actions可以包含任何异步操作,但是它们最终需要调用mutations来更新state中的数据。

  • Actions是通过dispatch方法来调用的,dispatch方法接收一个action的名称和一个可选的payload参数。当调用dispatch方法时,它会触发一个action,并且可以在action中执行任何异步操作。

  1. 定义actions
mutations: {changeCount (state, newCount) {state.count = newCount}
}actions: {setAsyncCount (context, num) {// 一秒后, 给一个数, 去修改 numsetTimeout(() => {context.commit('changeCount', num)}, 1000)}
}
  1. 组件中通过dispatch调用
setAsyncCount () {this.$store.dispatch('setAsyncCount', 666)
}

在这里插入图片描述

辅助函数 mapActions

  • mapActions 是把位于 actions中的方法提取了出来,映射到组件methods中
  • Son.vue
    import { mapActions } from 'vuex'
    methods: {...mapActions(['changeCountAction'])
    }//mapActions映射的代码 本质上是以下代码的写法
    //methods: {
    //  changeCountAction (n) {
    //    this.$store.dispatch('changeCountAction', n)
    //  },
    //}
    
  • 直接通过 this.方法 就可以调用
    <button @click="changeCountAction(200)">+异步</button>
    

vuex mutations VS actions

MutationsActions
目的修改state中的数据执行异步操作、调用多个mutations
同步/异步同步操作可以是同步或异步操作
使用场景更新state中的数据执行异步请求、处理复杂逻辑
调用方式使用commit方法调用使用dispatch方法调用
响应不能返回任何值,只能修改state可以返回Promise或异步操作的结果
跟踪可以在devtools中跟踪mutations的调用可以在devtools中跟踪actions的调用
  • 总体来说
    • mutations适用于同步操作,用于修改state中的数据。它们是可追踪的,可以在devtools中查看它们的调用。
    • actions适用于执行异步操作、调用多个mutations或处理复杂逻辑。它们可以是同步或异步操作,并且可以返回Promise或异步操作的结果。
    • 在调用上,mutations使用commit方法,而actions使用dispatch方法。

获取器(Getters)

  • getters用于从store中获取数据,类似于计算属性,可以基于store中的state计算出一个新的值。
  • getters可以看作是store的计算属性,它们的值会被缓存起来,只有当所依赖的state发生变化时才会重新计算。
  • 好处:可以将数据的处理逻辑从组件中抽离出来,将其放在store中,从而使得组件更加简洁和易于维护。另外,getters还可以在多个组件中共享和重复使用,避免了代码的冗余。

  • getter示例:
    • 定义doneTodos的getter,它基于store中的todos数组计算出一个新的数组,该数组包含所有已完成的todo对象
    const getters = {//getters: {// getters函数的第一个参数是 state// 必须要有返回值doneTodos: state => {return state.todos.filter(todo => todo.done)}
    }
    
  • 访问getters
    • 使用store访问getters
    {{ $store.getters.doneTodos}}
    
    • 在组件中使用这个getter,使用mapGetters辅助函数
import { mapGetters } from 'vuex'export default {computed: {...mapGetters(['doneTodos'])}
}

总结

  • 关于Vuex中state、getters、mutations和actions的使用总结:
StateGettersMutationsActions
用途存储应用程序的数据从state中派生出计算属性修改state中的数据执行异步操作、调用多个mutations
直接访问使用this.$store.state使用this.$store.getters不直接访问,通过commit方法调用不直接访问,通过dispatch方法调用
用法示例this.$store.state.countthis.$store.getters.doneTodosthis.$store.commit(‘increment’)this.$store.dispatch(‘fetchData’)
参数接收state作为参数接收state和payload作为参数接收context对象作为参数
返回值返回基于state的计算属性或派生数据无返回值,只能修改state可以返回Promise或异步操作的结果
异步操作不适用不适用不适用适用
跟踪可以在devtools中跟踪getters的调用可以在devtools中跟踪mutations的调用可以在devtools中跟踪actions的调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/121927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用超声波清洗机洗眼镜的有哪些?清洁力强的超声波清洗机不能错过

超声波清洗机在清洗眼镜方面表现出色&#xff0c;其强大的清洁能力可以彻底清除眼镜上的污垢和细菌。这种清洗方式被认为是一种高效且卫生的清洁方式&#xff0c;因为它利用高频振动和微射流打击力来清除污垢和细菌&#xff0c;而不是使用化学物质。对于那些长时间佩戴眼镜或者…

五、Qt中的常用类

1. QString 字符串类 QString是Qt中的字符串类&#xff0c;与C/C不同的是&#xff0c;不再使用ASCII编码&#xff0c;而使用Unicode编码。因此一个字符不是8位的char&#xff0c;而是16位的QChar&#xff0c;这就是为什么之前一个汉字占用一个字符的原因。、 QString几乎向前兼…

【Javascript】定时器

目录 延迟执行 定时执行 清除定时任务 延迟执行 setTimeout(function(){}, 毫秒) console.log(1); console.log(2); console.log(3); setTimeout(function (){console.log(5) },5000) console.log(4);setTimeout(function (){ console.log(5) },5000) 设定了一个任务&…

Proteus仿真--从左往右流水灯仿真(仿真文件+程序)

本文主要介绍基于51单片机的流水灯仿真&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真运行视频 Proteus仿真--基于51单片机的流水灯仿真&#xff08;从左往右&#xff09; 附完整Proteus仿真资料代码资料 百度网盘链接: https://pan.baidu.com/s/1aZH13zwQkNB7…

Go基础——数组、切片、集合

目录 1、数组2、切片3、集合4、范围&#xff08;range&#xff09; 1、数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列&#xff0c;这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。 Go 语言数组声明需要指定元素类型及元素个数&#xff0c;与…

Mybatis的Mapper文件报错:Tag name expected

目录 一、Mapper文件的错误信息 二、原因分析 三、解决方案 1、解决方式一&#xff1a;CDATA 2、解决方式二&#xff1a;预定义字符 一、Mapper文件的错误信息 在使用MyBatis时&#xff0c;我们通常会写一些sql语句。如下图&#xff0c;有时候我们会直接使用比较符号&…

docker 中给命令起别名

docker 的有些命令特别复杂&#xff0c;我们可以给它设置别名简化输入&#xff0c;就不用每次都输入那么多了&#xff01;&#xff01;&#xff01; 1. 进入 .bashrc 中修改配置&#xff08; .bashrc 是root下的隐藏文件&#xff09; cd /rootvim .bashrc2. 在 .bashrc 中加入…

LabVIEW开发TDS1000 和TDS2000 系列泰克示波器

LabVIEW开发TDS1000 和TDS2000 系列泰克示波器 泰克示波器是经常用到的工具&#xff0c;一般手动操作即可&#xff0c;但有时候也要集成到系统中&#xff0c;需要程控。这时候先要下载厂家提供的例子&#xff0c;了解LabVIEW的demo。根据不用的示波器型号&#xff0c;选择和计…

【Proteus仿真】【Arduino单片机】直流电机和步进电机

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用蜂鸣器、按键、直流电机、步进电机、ULN2003、L293D等。 主要功能&#xff1a; 系统运行后&#xff0c;K3键启动运行&#xff0c;K1和K2键控制…

MAC安装stable diffusion

./webui.sh --precision full --no-half-vae --disable-nan-check --api Command: "/Users/xxxx/aigc/stable-diffusion-webui/venv/bin/python3" -m pip install torch2.0.1 torchvision0.15.2 Error code: 2 执行命令&#xff1a; pip install torch2.0.1 torchvi…

【LeetCode力扣】189 53 轮转数组 | 最大子数组和

目录 1、189. 轮转数组 1.1、题目介绍 1.2、解题思路 2、53. 最大子数组和 2.1、题目介绍 2.2、解题思路 1、189. 轮转数组 1.1、题目介绍 原题链接&#xff1a;189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; ​ 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3输…

java原子类-Atomic

什么是原子类&#xff1f; java 1.5引进原子类&#xff0c;具体在java.util.concurrent.atomic包下&#xff0c;atomic包里面一共提供了13个类&#xff0c;分为4种类型&#xff0c;分别是&#xff1a; 原子更新基本类型&#xff0c;原子更新数组&#xff0c;原子更新引用&…

一次js请求一般情况下有哪些地方会有缓存处理

目录 前言 1. 浏览器缓存 1.1 强缓存 用法 代码 理解 1.2 协商缓存 用法 代码 理解 2. 服务端缓存 2.1 反向代理缓存 用法 代码 理解 2.2 应用层缓存 用法 代码 理解 3. CDN缓存 3.1 用法 3.2 理解 4. DNS缓存 4.1 用法 4.2 理解 5. AJAX请求缓存 5.…

【网络安全 --- 任意文件下载漏洞(1)】任意文件下载漏洞

一&#xff0c;环境&#xff0c;工具准备 1-1 VMVare 16 虚拟机及下载安装&#xff08;资源&#xff09; 请参考以下博客安装&#xff08;特详细&#xff09;&#xff1a;【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安…

Linux ln命令:建立链接文件

如果要想说清楚 ln 命令&#xff0c;则必须先解释下 ext 文件系统&#xff08;Linux 文件系统&#xff09;是如何工作的。我们在前面讲解了分区的格式化就是写入文件系统&#xff0c;而我们的 Linux 目前使用的是 ext4 文件系统。如果用一张示意图来描述 ext4 文件系统。 ext4 …

无需编程,小白也能建立个人网站

想要搭建一个属于自己的网站&#xff0c;但又不懂编程&#xff1f;别担心&#xff0c;现在有一个简单的方法可以帮助你轻松实现这个愿望。只需要几个简单的步骤&#xff0c;就可以让小白也能搭建出一个漂亮的网站。 首先&#xff0c;登录乔拓云账号&#xff0c;点击网站搭建进入…

2-多媒体数据压缩国际标准

文章目录 多媒体数据压缩编码的重要性和分类为什么要压缩?计算: 未压缩音频的数据率简答: 环绕声系统-作业题9(简述7.4.3全景声)计算: 未压缩图像的数据量-作业题10(估计尺寸及容量)计算: 未压缩视频的数据率 为什么能压缩?数据压缩编码的两大类无损压缩算法: LZ77-作业题6-(…

大数据Doris(十三):创建用户和创建数据库并赋予权限

文章目录 创建用户和创建数据库并赋予权限 一、创建用户

css-渐变色矩形

效果图&#xff1a; 代码&#xff1a; html: <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content"initial-scale1.0, user-scalableno" /><title></title><link …

【多线程面试题 六】、 如何实现线程同步?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a; 如何实现线程同步&…