Vue3之状态管理Vuex
Vuex作为Vue.js的官方状态管理库,在大型或复杂的前端项目中扮演着至关重要的角色。本文将从Vuex的原理、特点、应用场景等多个方面进行深入解析,并通过代码示例展示如何在Vuex中实现特定功能。
一、Vuex原理
Vuex是一个专为Vue.js应用程序开发的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex的核心概念包括state、getters、mutations、actions和modules,这些概念共同构成了一个完整的状态管理框架。
1.1 State(状态)
State是Vuex中的单一状态树,即用一个对象就包含了全部的应用层级状态。它是不可变的,只能通过提交mutations来修改。在Vue组件中,可以通过this.$store.state
来访问状态。
1.2 Getters(获取器)
Getters可以认为是store的计算属性,就像组件中的计算属性一样,getters的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。通过getters,可以方便地派生出一些状态,或对数据进行进一步的处理。
1.3 Mutations(变更)
Mutations是Vuex中唯一可以修改state的方法。每个mutation都有一个字符串的事件类型(type)和一个回调函数(handler)。这个回调函数是实际进行状态更改的地方,并且它会接受state作为第一个参数。需要注意的是,mutation必须是同步函数。
1.4 Actions(动作)
Actions类似于mutations,但它们主要用于处理异步操作。Actions可以包含任意异步操作,并在操作完成后提交mutations来修改state。通过actions,我们可以进行异步操作或复杂逻辑的提交,然后调用mutation来变更状态。
1.5 Modules(模块)
当项目比较大时,状态会集中,从而导致项目臃肿。Vuex允许将store分割成模块(module)。每个模块拥有自己的state、mutation、action、getter,甚至是嵌套子模块。这使得状态管理更加模块化和清晰。
二、Vuex特点
Vuex作为Vue.js的状态管理库,具有以下显著特点:
2.1 集中式状态管理
Vuex将应用的状态集中存储在一个单一的状态树中。这样可以方便地管理和追踪状态的变化,避免了状态分散在多个组件中导致的混乱和难以维护的问题。
2.2 组件之间共享状态
在大型应用中,多个组件可能需要共享某些状态,例如用户登录状态、购物车数量等。Vuex提供了一个中央存储库,使得多个组件可以方便地访问和修改共享状态。
2.3 状态的可追踪和可维护性
Vuex使用了响应式的状态管理,当状态发生变化时,相关的组件会自动更新。同时,Vuex提供了一些工具来追踪状态的变化,例如通过插件可以记录每个mutation的变更历史。这样可以更好地追踪和调试状态的变化。
2.4 简化组件通信
在Vue.js中,组件之间的通信可以通过props和事件来实现。但是当应用变得复杂时,组件之间的通信会变得困难和混乱。Vuex提供了一种集中式的数据流模式,使得组件之间的通信更加直观和可控。
三、Vuex应用场景
Vuex适用于多种应用场景,特别是在大型或复杂的前端项目中,其优势更加明显。以下是一些常见的应用场景:
3.1 管理大型应用的状态
在大型应用中,状态管理变得非常复杂。使用Vuex可以集中管理应用的所有状态,使得状态管理和共享变得更加简单和一致。
3.2 方便的状态共享
当多个组件需要共享状态时,使用Vuex可以方便地实现状态共享。例如,用户登录状态、购物车数量等全局状态都可以通过Vuex进行集中管理。
3.3 调试工具支持
Vuex与Vue Devtools无缝集成,提供了强大的调试工具。开发者可以使用Vue Devtools来追踪状态的变化、查看状态的历史记录等,从而更方便地进行调试和问题排查。
3.4 异步操作处理
Vuex的actions支持异步操作,可以方便地处理异步数据请求。通过actions,我们可以在异步操作完成后提交mutations来修改state,从而实现异步状态管理。
3.5 模块化管理
当项目比较大时,状态会集中,从而导致项目臃肿。Vuex允许将store分割成模块(module),每个模块拥有自己的state、mutation、action、getter等。这使得状态管理更加模块化和清晰。
四、代码示例
下面通过一个具体的代码示例来展示如何在Vuex中实现特定功能。
4.1 示例背景
假设我们正在开发一个购物车应用,该应用包含商品列表、购物车和用户个人信息等多个组件。我们需要使用Vuex来管理这些组件之间的共享状态。
4.2 创建Vuex Store
首先,我们需要在Vuex中定义一个状态树来存储所有需要共享的状态,如商品列表、购物车和用户个人信息等。然后,在Vue组件中通过this.$store.state
或this.$store.getters
等方式访问这些状态。
// store/index.js
import { createStore } from 'vuex'export default createStore({state: {cart: [], // 购物车商品列表userInfo: { // 用户个人信息name: '',email: ''}},mutations: {// 添加商品到购物车ADD_TO_CART(state, product) {const existItem = state.cart.find(item => item.id === product.id)if (existItem) {existItem.quantity += 1} else {state.cart.push({ ...product, quantity: 1 })}},// 从购物车中移除商品REMOVE_FROM_CART(state, productId) {state.cart = state.cart.filter(item => item.id !== productId)},// 更新用户信息UPDATE_USER_INFO(state, payload) {state.userInfo = { ...state.userInfo, ...payload }}},actions: {// 异步操作:从服务器获取用户信息并更新到store中fetchUserInfo({ commit }) {// 假设这里有一个异步请求获取用户信息setTimeout(() => {const userInfo = {name: 'John Doe',email: 'john.doe@example.com'}commit('UPDATE_USER_INFO', userInfo)}, 1000)}},getters: {// 获取购物车中商品的总数量cartItemCount: state => {return state.cart.reduce((total, item) => total + item.quantity, 0)},// 获取购物车中商品的总价格cartTotalPrice: state => {return state.cart.reduce((total, item) => total + item.price * item.quantity, 0)}}
})
4.3 在Vue组件中使用Vuex
接下来,我们需要在Vue组件中通过this.$store.state
、this.$store.getters
、this.$store.commit
和this.$store.dispatch
等方式访问和修改状态。
4.3.1 商品列表组件
商品列表组件用于展示商品列表,并提供将商品添加到购物车的功能。
<!-- src/components/ProductList.vue -->
<template><div><h1>商品列表</h1><ul><li v-for="product in products" :key="product.id">{{ product.name }} - ¥{{ product.price }}<button @click="addToCart(product)">添加到购物车</button></li></ul></div>
</template><script>
export default {data() {return {products: [{ id: 1, name: '商品A', price: 100 },{ id: 2, name: '商品B', price: 200 },{ id: 3, name: '商品C', price: 300 }]}},methods: {addToCart(product) {this.$store.commit('ADD_TO_CART', product)}}
}
</script>
4.3.2 购物车组件
购物车组件用于展示购物车中的商品列表,并提供移除商品的功能。
<!-- src/components/Cart.vue -->
<template><div><h1>购物车</h1><ul><li v-for="item in cartItems" :key="item.id">{{ item.name }} - ¥{{ item.price }} × {{ item.quantity }}<button @click="removeFromCart(item.id)">移除</button></li></ul><p>总数量: {{ cartItemCount }}</p><p>总价格: ¥{{ cartTotalPrice.toFixed(2) }}</p></div>
</template><script>
export default {computed: {cartItems() {return this.$store.state.cart;},cartItemCount() {return this.$store.getters.cartItemCount;},cartTotalPrice() {return this.$store.getters.cartTotalPrice;}},methods: {removeFromCart(productId) {this.$store.commit('REMOVE_FROM_CART', productId);}}
}
</script>
4.4 用户信息组件
用户信息组件用于展示和更新用户个人信息。
<!-- src/components/UserInfo.vue -->
<template><div><h1>用户信息</h1><p>姓名: {{ userInfo.name }}</p><p>邮箱: {{ userInfo.email }}</p><button @click="fetchUserInfo">更新用户信息</button></div>
</template><script>
export default {computed: {userInfo() {return this.$store.state.userInfo;}},methods: {fetchUserInfo() {this.$store.dispatch('fetchUserInfo');}}
}
</script>
4.5 将Vuex Store注入到Vue应用中
最后,我们需要在Vue应用的入口文件中将Vuex Store注入到Vue实例中,这样我们就可以在所有的Vue组件中通过this.$store
来访问和操作Store了。
// src/main.js
import { createApp } from 'vue'
import App from './App.vue'
import store from './store'const app = createApp(App)
app.use(store)
app.mount('#app')
4.6 说明
通过以上步骤,我们成功地在Vuex中实现了购物车应用的状态管理。我们定义了共享的状态树,创建了用于修改状态的mutations和用于异步操作的actions,还定义了方便获取状态的getters。然后,我们在Vue组件中通过this.$store
来访问和修改这些状态,实现了组件之间的数据共享和通信。这种集中式状态管理的方式使得我们的应用更加易于维护和扩展。
五、总结
Vuex作为Vue.js的官方状态管理库,为大型或复杂前端项目提供了高效的解决方案。它通过集中式存储管理应用状态,确保状态变化可预测。Vuex的核心包括state、getters、mutations、actions和modules,分别负责状态存储、状态派生、状态修改、异步操作和模块化管理。其特点在于集中式状态管理、组件间状态共享、状态可追踪维护以及简化组件通信。在购物车应用实例中,我们展示了如何在Vuex中定义状态树、创建mutations和actions、定义getters,并在Vue组件中访问和修改状态,实现了组件间的数据共享和通信。Vuex的应用极大地提升了应用的维护性和扩展性,是Vue.js开发中不可或缺的工具。
相关文章:
Vue3之状态管理Vuex
Vuex作为Vue.js的官方状态管理库,在大型或复杂的前端项目中扮演着至关重要的角色。本文将从Vuex的原理、特点、应用场景等多个方面进行深入解析,并通过代码示例展示如何在Vuex中实现特定功能。 一、Vuex原理 Vuex是一个专为Vue.js应用程序开发的状态管…...
DPO(Direct Preference Optimization)算法解释:中英双语
中文版 DPO paper: https://arxiv.org/pdf/2305.18290 DPO 算法详解:从理论到实现 1. 什么是 DPO? DPO(Direct Preference Optimization)是一种直接基于人类偏好进行优化的算法,旨在解决从人类偏好数据中训练出表现…...
Hostapd2.11解析笔记
最近在调试Hostapd,尝试通过配置使能一个支持MLO的AP,不过不知道hostapd conf里面哪些选项开启后可以使能,所以对Hostapd做一个整体解析. 简介 hostapd 是用于接入点和身份验证服务器的用户空间守护程序。它实现 IEEE 802.11 接入点管理、IEEE 802.1X/WPA/WPA2/WPA3/EAP 身份…...
js控制文字溢出显示省略号
.text{display: -webkit-box;overflow: hidden;white-space: normal;text-overflow: ellipsis;word-wrap: break-word;-webkit-line-clamp: 2;-webkit-box-orient: vertical; }本人有个需求就是在一个盒子内有一段文本,然后控制文本显示两行,第二行要显示…...

WPF+MVVM案例实战与特效(四十七)-实现一个路径绘图的自定义按钮控件
文章目录 1、案例效果2、创建自定义 PathButton 控件1、定义 PathButton 类2、设计样式与控件模板3、代码解释3、控件使用4、直接在 XAML 中绑定命令3、源代码获取4、总结1、案例效果 2、创建自定义 PathButton 控件 1、定义 PathButton 类 首先,我们需要创建一个新的类 Pat…...

操作002:HelloWorld
文章目录 操作002:HelloWorld一、目标二、具体操作1、创建Java工程①消息发送端(生产者)②消息接收端(消费者)③添加依赖 2、发送消息①Java代码②查看效果 3、接收消息①Java代码②控制台打印③查看后台管理界面 操作…...
odoo中@api.model, @api.depends和@api.onchange 装饰器的区别
文章目录 1. api.model用途特点示例 2. api.depends用途特点示例 3. api.onchange用途特点示例 总结 在 Odoo 中,装饰器(decorators)用于修饰方法,以指定它们的行为和触发条件。api.model、api.depends 和 api.onchange 是三个常用…...

有哪些精益工具可以帮助企业实现转型?
为了在激烈的市场竞争中立于不败之地,许多企业开始寻求通过精益转型来优化运营、降低成本、提高效率和客户满意度。然而,精益转型并非一蹴而就,而是需要一系列精益工具的辅助,这些工具能够帮助企业识别浪费、优化流程、提升质量&a…...

以太网帧结构
以太网帧结构 目前,我们局域网当中应用最广的技术或者协议啊,就是以太网。我们首先来看一下以太网的真结构。这块内容这里边再系统的来给大家去展开说一下,以太网真格式就如下面这个图。所示前面有八个字节,是用于时钟同步的&…...

QT调用Sqlite数据库
QT设计UI界面,后台访问数据库,实现数据库数据的增删改查。 零售商店系统 数据库表: 分别是顾客表,订单详情表,订单表,商品表 表内字段详情如下: 在QT的Pro文件中添加sql,然后添加头…...

前端
前端页面 Web页面 PC端程序页面 移动端APP页面 ... HTML页面 HTML超文本标记页面 超文本:文本,声音,图片,视频,表格,链接 标记:由许多标签组成 HTML页面运行到浏览器上面 vscode便捷插件使用 vs…...

【Git】—— 使用git操作远程仓库(gitee)
目录 一、远程仓库常用命令 1、从远程仓库克隆项目 2、查看关联的远程仓库 3、添加关联的远程仓库 4、移除关联的远程仓库 5、将本地仓库推送到远程仓库 6、从远程仓库拉取项目 二、分支命令 1、查询分支 2、创建分支 3、切换分支 4、推送到远程分支 5、合并分支 …...
Paddler负载均衡器
Paddler负载均衡器 Paddler本身是用Go语言编写的,没有直接的Python接口,但可以通过以下方式在Python中使用: 执行命令行调用 在Python中可以使用 subprocess 模块来调用Paddler的命令行工具,实现负载均衡功能 。例如: import subprocessdef start_paddler_agent():com…...

OSCP - Proving Grounds - Slort
主要知识点 文件包含 windows的reveseshell 具体步骤 执行nmap,依旧是很多端口开放,尝试了ftp,smb等均失败 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-13 12:00 UTC Nmap scan report for 192.168.53.53 Host is up (0.00095s latency). Not sho…...
YoloV9改进策略:Head改进|DynamicHead,利用注意力机制统一目标检测头部|即插即用
摘要 论文介绍 本文介绍了一种名为DynamicHead的模块,该模块旨在通过注意力机制统一目标检测头部,以提升目标检测的性能。论文详细阐述了DynamicHead的工作原理,并通过实验证明了其在COCO基准测试上的有效性和效率。 创新点 DynamicHead模块的创新之处在于它首次尝试在一…...

BFD综合详细实验配置案例
前言 本实验的目的是通过配置BGP(边界网关协议)、OSPF(开放式最短路径优先协议)、VRRP(虚拟路由冗余协议)以及BFD(双向转发检测)等网络协议,模拟企业级网络环境中的多协…...

自然语言处理与知识图谱的融合与应用
目录 前言1. 知识图谱与自然语言处理的关系1.1 知识图谱的定义与特点1.2 自然语言处理的核心任务1.3 二者的互补性 2. NLP在知识图谱构建中的应用2.1 信息抽取2.1.1 实体识别2.1.2 关系抽取2.1.3 属性抽取 2.2 知识融合2.3 知识推理 3. NLP与知识图谱融合的实际应用3.1 智能问答…...

c# RSA加解密工具,.netRSA加解密工具
软件介绍 名称: c# RSA加解密工具,.netRSA加解密工具依赖.net版本: .net 8.0工具类型: WinForm源码下载 c# RSA加解密工具,.netRSA加解密工具 依赖项 WinFormsRSA.csproj <Project...
Metricbeat安装教程——Linux——Metricbeat监控ES集群
Metricbeat安装教程——Linux 一、安装 下载安装包: 官网下载地址:https://www.elastic.co/cn/downloads/beats/metricbeat 上传包到linux 切换到安装目录下 解压:tar -zxvf metricbeat-7.17.1-linux-x86_64.tar.gz 重命名安装文件夹 mv met…...
一万多字拆解java中——“ 注解 ”的一切(三)(已完结)
前言: 咱们书接上回,上次按照框架讲了 第一篇,我们讲到了: ①注解的引入(简单概述):在jdk5.0的时候 ②注解与注释的区别: 注释 是为了帮助人类阅读代码,不会对程序的执…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...