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'  // 引入 store

new 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'  // 引入 store

createApp(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 仍然是推荐的选择。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ip属地是手机号还是手机位置?一文理清

在数字化和网络化的今天&#xff0c;IP属地这一概念逐渐成为了人们关注的焦点。特别是在社交媒体和在线平台上&#xff0c;IP属地的显示往往让人联想到用户的地理位置。然而&#xff0c;关于IP属地到底与手机号还是手机位置有关&#xff0c;却存在着不少误解和混淆。本文将深入…

【C语言高级特性】预处理指令(二)

目录 一、取消宏定义&#xff08;#undef&#xff09; 1.1. 详细介绍 1.2. 代码示例 1.3. 使用场景 1.4. 注意事项 二、#line 指令 2.1. 详细介绍 2.2. 代码示例 2.3. 使用场景 2.4. 注意事项 三、#error 和 #warning 指令 3.1. #error 3.2. #warning 3.3 注意事项…

vim-plug的自动安装与基本使用介绍

vim-plug介绍 Vim-plug 是一个轻量级的 Vim 插件管理器&#xff0c;它允许你轻松地管理 Vim 插件的安装、更新和卸载。相较于其他插件管理器&#xff0c;vim-plug 的优点是简单易用&#xff0c;速度较快&#xff0c;而且支持懒加载插件&#xff08;即按需加载&#xff09; 自动…

华为支付-免密支付接入免密代扣说明

免密代扣包括支付并签约以及签约代扣场景。 开发者接入免密支付前需先申请开通签约代扣产品&#xff08;即申请配置免密代扣模板及协议模板ID&#xff09;。 华为支付以模板维度管理每一个代扣扣费服务&#xff0c;主要组成要素如下&#xff1a; 接入免密支付需注意&#x…

AI安全最佳实践:AI云原生开发安全评估矩阵(下)

上篇小李哥带大家一起了解了什么是AI应用云原生开发安全评估矩阵&#xff0c;并且介绍了利用该矩阵如何确定我们云上AI应用的安全评估范围&#xff0c;接下来我们将继续本系列的下篇&#xff0c;基于该安全评估矩阵设计和实施我们系统应具备的安全控制。 优先考虑的安全控制 …

新星杯进化史:个人发起到CSDN官方支持,创作活动的新篇章

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作者&#x1…

jjwt -- Token 生成解析技术指南

引言 JWT&#xff08;JSON Web Token&#xff09;是一种基于JSON的、用于双方之间安全传输信息的简洁的、URL安全的令牌标准。在现代Web应用程序中&#xff0c;JWT作为一种高效且安全的认证机制&#xff0c;被广泛应用于用户身份验证和信息交换场景。本文旨在详细介绍JWT Toke…

第 2 天:创建你的第一个 UE5 C++ 项目!

&#x1f3af; 目标&#xff1a; 掌握 UE5 C 项目的创建流程&#xff0c;了解代码结构&#xff0c;并成功运行第一个 C 类&#xff01; 1️⃣ 创建 UE5 C 项目 在 UE5 中&#xff0c;C 项目可以与蓝图&#xff08;Blueprint&#xff09;结合使用&#xff0c;让游戏逻辑更灵活…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)

接上篇&#xff1a;《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》 链接 文章目录 4.安装RabbitMQ Messaging Topology Operator 裸金属环境部署RabbitMQ部署单实例部署集群 4.安装RabbitMQ Messaging Topology Operator 使用 cer…

vs code 使用教程

一、定义 多行注释vs 找不到上层文件路径选择 或 创建python 虚拟环境git 远程克隆及推送vs code 文件路径vs 使用tensorboard 二、使用 学习网站&#xff1a;https://learn.microsoft.com/zh-cn/visualstudio/python/?viewvs-2022性能分析&#xff1a;https://learn.micros…

【Elasticsearch】terms聚合误差问题

Elasticsearch中的聚合查询在某些情况下确实可能存在误差&#xff0c;尤其是在处理分布式数据和大量唯一值时。这种误差主要来源于以下几个方面&#xff1a; 1.分片数据的局部性 Elasticsearch的索引通常被分成多个分片&#xff0c;每个分片独立地计算聚合结果。由于数据在分…

BUU22 [护网杯 2018]easy_tornado 1

打开题目以后出现三个文件&#xff0c;查看源代码&#xff0c;突破口在于这三个文件都有特殊的格式 python的tornado漏洞 Tornado 是一个用 Python 编写的 Web 框架&#xff08;和flask一样&#xff0c;只不过flask是轻量级的&#xff0c;而tornado可以处理高流量&#xff09…

QT修仙之路1-1--遇见QT

文章目录 遇见QT二、QT概述2.1 定义与功能2.2 跨平台特性2.3 优点汇总 三、软件安装四、QT工具介绍(重要)4.1 Assistant4.2 Designer4.3 uic.exe4.4 moc.exe4.5 rcc.exe4.6 qmake4.7 QTcreater 五、QT工程项目解析(作业)5.1 配置文件&#xff08;.pro&#xff09;5.2 头文件&am…

寒假2.5

题解 web:[网鼎杯 2020 朱雀组]phpweb 打开网址&#xff0c;一直在刷新&#xff0c;并有一段警告 翻译一下 查看源码 每隔五秒钟将会提交一次form1&#xff0c;index.php用post方式提交了两个参数func和p&#xff0c;func的值为date&#xff0c;p的值为Y-m-d h:i:s a 执行fu…

计算机中数值表示:原码、反码、补码与移码

1 前言 计算机科学中&#xff0c;数字的表示方式至关重要&#xff0c;因为计算机内部只能识别处理二进制数据。为了在计算机中实现对整数的表示&#xff0c;提出了多种数值编码方式&#xff0c;其中最常用的是原码、反码、补码和移码。 2 原码 2.1 原码的定义 原码(Signed …

硬件实现I2C常用寄存器简单介绍

引言 在深入探讨I2C外设的具体案例之前&#xff0c;理解其核心寄存器的配置至关重要。这些寄存器不仅控制着I2C模块的基本操作模式&#xff0c;如数据传输速率和地址识别&#xff0c;还负责管理更复杂的通信需求&#xff0c;例如中断处理、DMA交互及错误检测与恢复。接下来的内…

分析用户请求K8S里ingress-nginx提供的ingress流量路径

前言 本文是个人的小小见解&#xff0c;欢迎大佬指出我文章的问题&#xff0c;一起讨论进步~ 我个人的疑问点 进入的流量是如何自动判断进入iptables的四表&#xff1f;k8s nodeport模式的原理&#xff1f; 一 本机环境介绍 节点名节点IPK8S版本CNI插件Master192.168.44.1…

linux中,软硬链接的作用和使用

一、软硬链接的作用 软硬链接&#xff0c;是大家所熟系的内容了。链接就是方便人使用电脑上访问文件、方便进程访问文件的工具。比如软连接大家都有见过&#xff0c;在安装某款软件的时候要不要添加快捷方式。在windows系统上&#xff0c;我们右键点击文件的时候按‘s’就能创建…

kalman滤波器C++设计仿真实例第三篇

1. 仿真场景 水面上有条船在做匀速直线航行&#xff0c;航行过程中由于风和浪的影响&#xff0c;会有些随机的干扰&#xff0c;也就是会有些随机的加速度作用在船身上&#xff0c;这个随机加速度的均方差大约是0.1&#xff0c;也就是说方差是0.01。船上搭载GPS设备&#xff0c;…

ubuntu20.04+RTX4060Ti大模型环境安装

装显卡驱动 这里是重点&#xff0c;因为我是跑深度学习的&#xff0c;要用CUDA&#xff0c;所以必须得装官方的驱动&#xff0c;Ubuntu的附件驱动可能不太行. 进入官网https://www.nvidia.cn/geforce/drivers/&#xff0c;选择类型&#xff0c;最新版本下载。 挨个运行&#…