当前位置: 首页 > 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.深度学习架构 大模型基于深度学习技术,通常采用多层神经网络进行特征学习与抽象。其中…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...