当前位置: 首页 > news >正文

Vuex 解析:从 Vue 2 到 Vue 3 的演变与最佳实践

Vuex 是 Vue.js 中的状态管理模式,广泛应用于 Vue 2 和 Vue 3 中,其内部实现存在一些差异。

1. 什么是 Vuex ?

Vuex 是 Vue.js 官方提供的状态管理库,用于集中管理应用的所有组件的状态。主要是通过一种集中化的方式来管理共享状态,尤其适用于中大型应用,避免了复杂的组件间通信问题(如 props 和 events)。Vuex 基于 Flux 架构,使用了单向数据流。它能够确保状态的变化是可预测的,从而提高了代码的可维护性。

1.1 Vuex 的核心概念
  • State:应用的状态,存储数据。
  • Getters:计算属性,派发获取应用状态的逻辑。
  • Mutations:同步修改状态的方法。
  • Actions:包含异步操作修改状态的方法。
  • Modules:模块化的 Vuex 状态管理,每个模块都有自己的 state、mutations、actions 和 getters。

2. Vuex 在 Vue 2 中的使用

2.1 Vuex 的安装与配置

在 Vue 2 中使用 Vuex,首先需要安装 Vuex:

npm install vuex@3

然后在 Vue 根实例中引入并配置 Vuex:

// main.js
import Vue from 'vue'
import App from './App.vue'
import store from './store'  // 引入 storenew Vue({render: h => h(App),store  // 确保这里注入了 Vuex store
}).$mount('#app')
2.2 Vuex 核心概念与模块

1、State

state 用于存储应用的状态。状态是集中管理的,不同组件间的共享数据都存放在 Vuex 的 state 中。

2、Getters

getters 用于从 state 中派生出一些计算值。

3、Mutations

mutations 用于同步直接修改 state。Mutation 是唯一可以直接修改 state 的方式。

4、Actions

actions 用于处理异步操作,并通过 commit 提交 mutations 来改变 state。

2.3 具体示例 🌰

目录结构

src/├── assets/├── components/├── store/│   ├── index.ts  // Vuex store 的入口文件│   └── modules/│       └── cart.ts  // 用于管理购物车的模块├── App.vue└── main.ts

1、cart.js 定义 Vuex 模块

// store/modules/cart.js
const cart = {namespaced: true, // 启用命名空间state: {items: []},getters: {// 获取购物车中的商品总数itemCount(state) {return state.items.reduce((count, item) => count + item.quantity, 0)},// 计算购物车中的总价totalPrice(state) {return state.items.reduce((total, item) => total + item.price * item.quantity, 0)}},mutations: {// 添加商品到购物车addItem(state, item) {const existingItem = state.items.find(i => i.id === item.id)if (existingItem) {existingItem.quantity += item.quantity} else {state.items.push(item)}},// 删除购物车中的商品removeItem(state, itemId) {state.items = state.items.filter(item => item.id !== itemId)},// 更新商品的数量updateItemQuantity(state, { itemId, quantity }) {const item = state.items.find(item => item.id === itemId)if (item) {item.quantity = quantity}}},actions: {// 异步添加商品到购物车addItemAsync({ commit }, item) {setTimeout(() => {commit('addItem', item)}, 1000)},// 异步删除商品removeItemAsync({ commit }, itemId) {setTimeout(() => {commit('removeItem', itemId)}, 1000)}}
}export default cart

2、store/index.js 注册 Vuex 模块

// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import cart from './modules/cart'  // 导入 cart 模块Vue.use(Vuex)export default new Vuex.Store({modules: {cart // 注册 cart 模块}
})

3、在 App.vue 中使用 Vuex

<template><div id="app"><h1>购物车</h1><div><p>购物车商品总数:{{ itemCount }}</p><p>购物车总价:{{ totalPrice }} 元</p></div><div><button @click="addItemToCart">添加商品</button><button @click="removeItemFromCart">删除商品</button></div></div>
</template>
<script>
import { mapState, mapActions } from 'vuex'export default {computed: {// 使用命名空间,映射 cart 模块的状态...mapState('cart', ['items']),itemCount() {return this.$store.getters['cart/itemCount'] // 获取购物车商品总数},totalPrice() {return this.$store.getters['cart/totalPrice'] // 获取购物车总价}},methods: {...mapActions('cart', ['addItemAsync', 'removeItemAsync']), // action 方法映射addItemToCart() {const newItem = { id: 1, name: '商品A', price: 100, quantity: 1 }this.addItemAsync(newItem)},removeItemFromCart() {this.removeItemAsync(1)}}
}
</script>

页面展示为: 

3. Vuex 在 Vue 3 中的改进

Vuex 的状态更新是响应式的,更新后的状态会自动反映到视图中。

3.1 Vue 3 新特性对 Vuex 的影响

Vue 3 引入了许多新特性,如 Composition API,这些特性对 Vuex 的使用方式产生了一定的影响。Vue 3 强调逻辑的组合性和函数式编程,因此许多开发者希望在 Vue 3 中能够采用更灵活的状态管理方案。

Vuex 4.0 版本的更新

Vue 3 发布后,Vuex 也做了相应的版本更新,即 Vuex 4.x。Vuex 4.x 是专门为 Vue 3 提供的版本,主要改进和新增了以下几个方面:

  1. 支持 Vue 3 的响应式系统:Vuex 4.x 能够与 Vue 3 的响应式系统更好地结合。通过 Vue 3 的 reactive、ref 等 API,Vuex 更加高效。
  2. 使用 Composition API 的支持:Vuex 4.x 可以和 Vue 3 的 Composition API 一起使用,为开发者提供了更灵活的状态管理方法。
3.2 Vuex 的安装与配置

在 Vue 3 中使用 Vuex,首先需要安装 Vuex 4.x:

npm install vuex@next

然后在 Vue 根实例中引入并配置 Vuex: 

import { createApp } from 'vue'
import App from './App.vue'
import store from './store'  // 引入 storecreateApp(App).use(store)  // 使用 Vuex store.mount('#app')
3.3 具体示例 🌰

延用购物车 cart 的示例

1、cart.js 定义 Vuex 模块 --- 不变 

2、store/index.js 注册 Vuex 模块

// store/index.ts
import { createStore } from 'vuex'
import cart from './modules/cart'const store = createStore({modules: {cart}
})export default store

3、在 App.vue 中使用 Vuex

Tip:store.commit 用于触发 mutation,而 mutation 是同步操作。如果需要执行异步操作,使用 store.dispatch 来触发 actions。

<template><div id="app"><h1>购物车</h1><div><p>购物车商品总数:{{ itemCount }}</p><p>购物车总价:{{ totalPrice }} 元</p></div><div><button @click="addItemToCart">添加商品</button><button @click="removeItemFromCart">删除商品</button></div></div>
</template><script>
import { defineComponent, computed } from 'vue'
import { useStore } from 'vuex'export default defineComponent({setup() {const store = useStore()const itemCount = computed(() => store.getters['cart/itemCount'])const totalPrice = computed(() => store.getters['cart/totalPrice'])const addItemToCart = () => {const newItem = { id: 1, name: '商品A', price: 100, quantity: 1 }store.dispatch('cart/addItemAsync', newItem)}const removeItemFromCart = () => {store.dispatch('cart/removeItemAsync', 1)}return {itemCount,totalPrice,addItemToCart,removeItemFromCart}}
})
</script>

页面展示:

4. Vuex 与 Vue 3 新状态管理工具 Pinia 的对比

4.1 为什么 Vue 3 引入 Pinia?

Pinia 是 Vue 3 推荐的状态管理工具,它旨在替代 Vuex,尤其是在 Vue 3 中。其设计目标是简化 API,提供更好的 TypeScript 支持,并与 Vue 3 的 Composition API 完美集成。

4.2 Vuex vs Pinia(Vue 3)对比
特性VuexPinia
适用 Vue 版本Vue 2 和 Vue 3(但是 Vue 3 支持较弱)只支持 Vue 3
API 风格

类似于 Flux(state,mutations,actions,getters)

现代化的 API(state,actions,getters)
类型支持TypeScript 支持不完善完美支持 TypeScript
与 Vue 3 的兼容性不完美,Vue 3 Composition API 集成差完美兼容,支持 Vue 3 Composition API
模块化支持模块化(但需要显式声明 namespaced)模块化非常灵活,天然支持模块化
易用性配置繁琐,特别是在大型项目中简洁易用,API 简单直观
性能性能不错,但对于大型应用可能较重性能优化,轻量级,适合 Vue 3 环境

Vuex 与 Pinia 的选择建议

对于新的 Vue 3 项目,建议使用 Pinia,尤其是在需要高度类型推导和简洁 API 的场景中。对于现有的 Vue 2 项目,Vuex 仍然是推荐的选择。

相关文章:

Vuex 解析:从 Vue 2 到 Vue 3 的演变与最佳实践

Vuex 是 Vue.js 中的状态管理模式&#xff0c;广泛应用于 Vue 2 和 Vue 3 中&#xff0c;其内部实现存在一些差异。 1. 什么是 Vuex &#xff1f; Vuex 是 Vue.js 官方提供的状态管理库&#xff0c;用于集中管理应用的所有组件的状态。主要是通过一种集中化的方式来管理共享状…...

一文解释nn、nn.Module与nn.functional的用法与区别

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;零基础入门PyTorch框架_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 …...

日志统计(acWing,蓝桥杯)

题目&#xff1a; 1238. 日志统计 题目 提交记录 讨论 题解 视频讲解 小明维护着一个程序员论坛。现在他收集了一份”点赞”日志&#xff0c;日志共有 NN 行。 其中每一行的格式是&#xff1a; ts id 表示在 tsts 时刻编号 idid 的帖子收到一个”赞”。 现在小明想…...

3个DeepSeek隐藏玩法

大家最近是不是都被DeepSeek-R1刷屏了 这款号称“中国版O1”的模型&#xff0c;不仅在数学和编程领域表现出色&#xff0c;中文写作能力也很强。 最重要的是&#xff0c;它在理解提示词方面有了很大突破&#xff0c;只要你能打字&#xff0c;它就能理解你的意思。 不过&…...

部署LLM模型到云端

文章目录 1 ECS 云服务器部署2 函数计算FC3 人工智能平台PAI-EAS4 大模型服务平台百炼压测实验结果显示,由于本地设备算力有限,本地部署的模型服务无法满足低延迟和高并发的需求。针对这类线上业务,可以考虑云端部署。 下面先来看看本地部署和云端部署的特点对比。 由上可…...

Python连接不同数据库的总结

Python连接不同数据库的总结 在数据驱动的现代应用开发中&#xff0c;Python凭借其丰富的库和强大的生态系统&#xff0c;成为连接各种数据库的理想编程语言。本文将深入探讨Python连接不同类型数据库的方法、常用库以及关键注意事项。 一、连接MySQL数据库 MySQL是广泛使用…...

web直播弹幕抓取分析 signature

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言 最近遇到太多难点了卡了很久&am…...

Linux ftrace 内核跟踪入门

文章目录 ftrace介绍开启ftraceftrace使用ftrace跟踪指定内核函数ftrace跟踪指定pid ftrace原理ftrace与stracetrace-cmd 工具KernelShark参考 ftrace介绍 Ftrace is an internal tracer designed to help out developers and designers of systems to find what is going on i…...

1Panel应用推荐:WordPress开源博客软件和内容管理系统

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…...

【数据结构-C语言】绪论

文章目录 一、前言二、基本概念和术语2.1 数据元素、数据项和数据对象2.2 数据结构2.2.1 逻辑结构2.2.2 存储结构 2.3 时间复杂度 一、前言 数据结构部分是根据严蔚敏老师的《数据结构-C语言版第2版》书中内容整理的。 二、基本概念和术语 2.1 数据元素、数据项和数据对象 …...

java poi Excel 文件导入导出常见错误及解决方案

在使用 Apache POI 进行 Excel 文件的导入导出操作时&#xff0c;可能会遇到各种问题。以下是一些常见的错误及其解决方案&#xff1a; 一、文件格式相关问题 1. 文件格式不兼容 问题描述&#xff1a;尝试使用 HSSFWorkbook 读取 .xlsx 文件&#xff0c;或者使用 XSSFWorkbo…...

深入浅出DeepSeek LLM 以长远主义拓展开源语言模型

深入浅出地讲解DeepSeek LLM 以长远主义拓展开源语言模型 &#x1f31f; 1. 什么是 DeepSeek LLM&#xff1f; 大家想象一下&#xff0c;你在游戏里要打造一个超级英雄角色&#xff0c;选择最强的装备、技能点和升级策略。那么&#xff0c;DeepSeek LLM 就是 AI 界的“超级英雄…...

【Leetcode 每日一题】59. 螺旋矩阵 II

问题背景 给你一个正整数 n n n&#xff0c;生成一个包含 1 1 1 到 n 2 n ^ 2 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n n n \times n nn 正方形矩阵 m a t r i x matrix matrix。 数据约束 1 n 20 1 \times n \times 20 1n20 解题过程 定义方向数组…...

回退 android studio emulator 的版本

前情提要 最近用 frida 需要一个完全跑 arm64 的手机 os&#xff0c;因为雷电实时转义 arm 到 x64 的方案本质上还是 x64&#xff0c;会导致 frida 有 bug。查了一下有帖子说 android studio 自带的模拟器支持直接跑 arm64 的镜像 (Other Images) 直接跑跑不通&#xff0c;调…...

数据资产的管理与价值释放

引言&#xff1a;从 “黑金” 到 “数据” 的文明跃迁 在探讨数字资产的未来之前&#xff0c;我们不妨先回顾一下黄金在人类历史长河中的角色。黄金&#xff0c;这种闪耀着独特光芒的金属&#xff0c;从远古时代起就与人类文明紧密相连。在古埃及&#xff0c;黄金被视为太阳神…...

部署夜景增强模型Learning to See in the Dark以及gradio UI编程方法

前面我们已经把Learning to See in the Dark的paper和原理进行了解读&#xff0c;现在把Learning to See in the Dark&#xff08;后续简称SID模型&#xff09;部署看一下效果。 这篇文章选择的部署方式是gradio 本地pytorch直接推理。先看一下效果&#xff1a; 对单个文件进…...

【报错解决】MySQL报错:sql_mode=only_full_group_by

文章目录 报错信息 DataGrip 报错还原Navicat 报错还原 报错原因解决方案 查看当前 sql mode方案一&#xff1a;临时解决方案二&#xff1a;永久解决方案三&#xff1a;使用 any_value() 或 group_concat()方案四&#xff1a;调整实现思路&#xff0c;避开 GROUP BY 使用 我…...

【大数据技术】用户行为日志分析(python+hadoop+mapreduce+yarn+hive)

用户行为日志分析&#xff08;pythonhadoopmapreduceyarnhive&#xff09; 搭建完全分布式高可用大数据集群&#xff08;VMwareCentOSFinalShell&#xff09; 搭建完全分布式高可用大数据集群&#xff08;HadoopMapReduceYarn&#xff09; 本机PyCharm远程连接虚拟机Python …...

[Day 16]螺旋遍历二维数组

今天我们看一下力扣上的这个题目&#xff1a;146.螺旋遍历二维数组 题目描述&#xff1a; 给定一个二维数组 array&#xff0c;请返回「螺旋遍历」该数组的结果。 螺旋遍历&#xff1a;从左上角开始&#xff0c;按照 向右、向下、向左、向上 的顺序 依次 提取元素&#xff0c…...

大模型的底层逻辑及Transformer架构

一、大模型的底层逻辑 1.数据驱动 大模型依赖海量的数据进行训练,数据的质量和数量直接影响模型的性能。通过大量的数据,模型能够学习到丰富的模式和规律,从而更好地处理各种任务。 2.深度学习架构 大模型基于深度学习技术,通常采用多层神经网络进行特征学习与抽象。其中…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...

虚幻基础:角色旋转

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 移动组件使用控制器所需旋转&#xff1a;组件 使用 控制器旋转将旋转朝向运动&#xff1a;组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转&#xff1a;必须移动才能旋转&#xff0c;不移动不旋转控制器…...