Vuex 与 Pinia:Vue 状态管理库的选择与对比

1. Vuex 与 Pinia 概述

Vuex

Vuex 是 Vue 官方的状态管理库,首次发布于 Vue 2.x,专门为 Vue 应用设计的全局状态管理工具。Vuex 将所有的状态放在一个全局 store 中,组件通过分发(dispatch)动作(actions)来修改状态,并且 Vuex 使用严格的规则来确保状态的变更是可追踪和可调试的。

Pinia

Pinia 是 Vue 3 的官方状态管理库,它是 Vuex 的继任者,利用 Vue 3 的新特性(如 Composition API 和 Proxy)提供了更简洁、更现代化的 API。Pinia 由 Vue 团队官方开发和维护,目的是改善 Vuex 的一些痛点,使得状态管理更加轻量和灵活。

2. 核心对比

特性VuexPinia
Vue 版本支持 Vue 2 和 Vue 3仅支持 Vue 3
API 设计基于 Vuex store + mutations + actions基于 Composition API,使用 defineStore 定义 store
模块化支持模块化(namespace)支持模块化,但更加灵活简洁
响应式使用 Vue 的 reactivity API,但较复杂完全基于 Vue 3 的 Proxy 实现,响应式更简单
开发体验严格的状态变更规则(mutation)更直观的 API,支持开发者更自由地组织状态
插件与扩展有多种插件支持,但需要配置内建支持插件,并且更容易集成扩展
热重载支持热重载,但在大项目中性能较差热重载更加快速和流畅
状态持久化支持插件,开发者手动配置支持更容易的持久化插件支持
学习曲线需要学习 mutations, actions 和 getters更简单,基本靠 Composition API

3. Vuex 与 Pinia 的优势与劣势

Vuex 优势
  • 成熟稳定:作为 Vue 的官方状态管理库,Vuex 已经经过多年的实践检验,广泛应用于许多大型项目中。
  • 社区支持:Vuex 拥有强大的社区支持和丰富的文档。
  • Vue 2 支持:如果你正在开发 Vue 2 项目,Vuex 是首选。
Vuex 劣势
  • 较复杂的 API:Vuex 使用 mutation 来管理状态变更,这会增加一些冗余代码,尤其是在大型应用中,管理复杂的状态变得较为困难。
  • 不适配 Vue 3 的 Composition API:尽管 Vuex 支持 Vue 3,但它并不是为 Composition API 设计的,导致使用上不如 Pinia 灵活。
Pinia 优势
  • 更简洁的 API:Pinia 基于 Vue 3 的 Composition API,使得状态管理的代码更加简洁,易于理解。
  • 响应式更好:Pinia 完全基于 Vue 3 的 Proxy 实现,自动追踪状态依赖,响应式更强大。
  • 与 Vue 3 无缝集成:Pinia 是为 Vue 3 设计的,与 Vue 3 的新特性(如 Composition API 和 Suspense)更好地兼容。
  • 自动类型推导:在 TypeScript 环境下,Pinia 提供了开箱即用的类型推导,减少了配置和手动类型声明的工作量。
Pinia 劣势
  • 不支持 Vue 2:Pinia 仅支持 Vue 3,因此,如果你的项目是基于 Vue 2 的,Pinia 无法使用。
  • 较新,社区和生态还在成长:虽然 Pinia 已经被 Vue 团队推荐为官方状态管理库,但相比 Vuex,Pinia 仍然较新,部分工具和插件可能还不够完善。

 4.主要区别代码示例

① API 风格

Vuex 的 API 比较冗长,尤其是对于 Vue 3 的开发者,使用 Vuex 时常常需要手动管理 mutationsactions 等逻辑。而 Pinia 基于 Vue 3 的 Composition API,API 更加简洁和直观。

Vuex 示例:

// store.js (Vuex)
import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);const store = new Vuex.Store({state: {count: 0},mutations: {increment(state) {state.count++;}},actions: {incrementAsync({ commit }) {setTimeout(() => {commit('increment');}, 1000);}}
});export default store;

Pinia 示例:

// store.js (Pinia)
import { defineStore } from 'pinia';export const useCounterStore = defineStore('counter', {state: () => ({count: 0}),actions: {increment() {this.count++;},incrementAsync() {setTimeout(() => {this.increment();}, 1000);}}
});
② 响应式设计

Vuex 使用的是 Vue 2 的响应式系统,在 Vue 3 中仍然有效,但在 Vue 3 中,Pinia 基于 Vue 3 的响应式 API(reactiveref)设计,状态管理更加简洁和符合 Vue 3 的最佳实践。

Vuex 响应式:

在 Vuex 中,状态是响应式的,但你必须依赖 Vuex 的方法来获取状态。

const store = new Vuex.Store({state: {count: 0}
});// 在组件中访问状态
this.$store.state.count

Pinia 响应式:

在 Pinia 中,状态本身就是响应式的,你可以直接在组件中使用。

import { useCounterStore } from './store';const counter = useCounterStore();
console.log(counter.count);  // 自动响应式更新
③ 模块化(Stores)

Vuex 使用模块化时需要额外配置,每个模块都有自己的 statemutationsactions。而 Pinia 的模块化更加简洁,每个 store 本身就是一个模块,且不需要额外的配置。

Vuex 模块化示例:

const store = new Vuex.Store({modules: {counter: {state: {count: 0},mutations: {increment(state) {state.count++;}},actions: {incrementAsync({ commit }) {setTimeout(() => {commit('increment');}, 1000);}}}}
});

Pinia 模块化示例:

Pinia 的 store 设计本身就是模块化的,所有的 store 都是独立的。

// counterStore.js
import { defineStore } from 'pinia';export const useCounterStore = defineStore('counter', {state: () => ({count: 0}),actions: {increment() {this.count++;},incrementAsync() {setTimeout(() => {this.increment();}, 1000);}}
});
④ 插件与开发工具

Vuex 提供了一个强大的插件系统,支持 Vue DevTools 进行调试,但需要手动安装插件支持。Pinia 自带集成的开发工具,无需额外配置,且内置支持状态持久化和调试功能。

Vuex 开发工具配置:

// store.js (Vuex) 使用 Vue DevTools
const store = new Vuex.Store({state: {count: 0},mutations: {increment(state) {state.count++;}}
});// 在浏览器控制台启用 Vue DevTools

Pinia 开发工具:

Pinia 自动集成开发工具,无需额外配置。

import { createPinia } from 'pinia';const pinia = createPinia();
app.use(pinia);
⑤ 异步操作

Vuex 和 Pinia 都支持异步操作,但在 Vuex 中需要通过 actions 来处理异步任务,并显式地提交 mutations 来修改状态。而 Pinia 则通过 actions 可以直接修改状态,省去了提交 mutations 的步骤。

Vuex 异步操作:

// Vuex 异步操作
actions: {incrementAsync({ commit }) {setTimeout(() => {commit('increment');}, 1000);}
}

Pinia 异步操作:

// Pinia 异步操作
actions: {async incrementAsync() {await new Promise(resolve => setTimeout(resolve, 1000));this.increment();}
}

5. 适用场景

  • 使用 Vuex 的场景

    • 如果你还在使用 Vue 2,Vuex 是唯一的选择。
    • 你需要一个稳定、经过时间考验的库,且对复杂的状态管理和多模块支持有需求。
    • 需要在一个庞大的、需要多开发者协作的项目中使用。
  • 使用 Pinia 的场景

    • 如果你正在开发基于 Vue 3 的新项目,Pinia 是最优选择。
    • 如果你希望使用 Vue 3 的 Composition API 并享受更简单的状态管理方案。
    • 如果你倾向于使用更现代、简洁的状态管理解决方案,同时需要更好的类型支持和开发体验。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】程序性能优化——除法运算符

【C语言】程序性能优化——除法运算符 文章目录 [TOC](文章目录) 前言一、牛顿迭代法1、数学基础2、C代码3、实验 二、二分法1、数学基础2、C代码3、实验 三、参考资料总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、牛顿迭代法 1、数学…

每日计划-1109

1. 完成 104. 二叉树的最大深度 class Solution { public:// 计算二叉树的最大深度的函数int maxDepth(TreeNode* root) {// 如果根节点为空,说明已经到达叶子节点的下一层,返回0(这里代码中 return false 应该是错误的,应该是 r…

基于YOLOv5的人群密度检测系统设计与实现

大家好,本文将介绍基于改进后的YOLOv5目标检测模型,设计并实现人群密度检测系统。 使用YOLOv5的源代码,在此基础上修改和训练模型, 数据集选用crowdhuman数据集。对yolov5源码中的文件进行修改,更换主干网络、改进损失…

鸿蒙入门——ArkUI 自定义组件间的父子双向同步状态装饰器@Link语法(四)

文章大纲 引言一、组件间状态装饰器Link 父子双向同步1、使用规则2、支持的观察变化的场景和ArkUI 刷新UI3、Link变量值初始化和更新机制3.1、初始渲染:执行父组件的build()函数后将创建子组件的新实例。3.2、Link的数据源的更新:即父组件中状态变量更新…

【Android、IOS、Flutter、鸿蒙、ReactNative 】启动页

Android 设置启动页 自定义 splash.xml 通过themes.xml配置启动页背景图 IOS 设置启动页 LaunchScreen.storyboard 设置为启动页 storyboard页面绘制 Assets.xcassets 目录下导入图片 AppLogo Flutter 设置启动页 Flutter Android 设置启动页 自定义 launch_background.xm…

[SaaS] 数禾科技 AIGC生成营销素材

https://zhuanlan.zhihu.com/p/923637935https://zhuanlan.zhihu.com/p/923637935

前端开发中常用的包管理器(npm、yarn、pnpm、bower、parcel)

文章目录 1. npm (Node Package Manager)2. Yarn (Yarn Package Manager)3. pnpm4. Bower5. Parcel总结 前端开发中常用的包管理器主要有以下几个: 1. npm (Node Package Manager) 简介: npm 是 Node.js 的默认包管理器,也是最广泛使用的包…

【go从零单排】Random Numbers、Number Parsing

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 这里是引用 💻代码 Random Numbers package mainimport ("fmt…

qt移植到arm报错动态库找不到

error while loading shared libraries: libAlterManager.so.1: cannot open shared object file: No such file or directory 通过设置环境变量 LD_LIBRARY_PATH就行了。 LD_LIBRARY_PATH是一个用于指定动态链接器在运行时搜索共享库的路径的环境变量。 例如: 前…

GoogleMIT:多智能体医疗决策框架MDAgents

|记昨日与国内某Top 1&2 医院科室老师及团队探讨技术、医学、信仰与责任而有感而发。 生成式基础大模型正在成为临床辅助甚至医学探索领域的宝贵工具。尽管我们在国内看到了很多企业或实验室联合医疗机构在如医疗记录生成、临床表型辅助诊疗、医疗知识问答交互、医院管理决…

【数据库】深入解析慢 SQL 的识别与优化策略

文章目录 什么是慢 SQL?慢 SQL 的危害如何检测分析慢 SQL使用 MySQL 慢查询日志利用 EXPLAIN 分析执行计划通过 Profiling 获取详细执行信息借助慢 SQL 收集分析平台 实际案例解析:600秒的慢 SQL 优化之旅问题描述初步分析优化步骤1. 优化 SQL 语句结构2…

高校大数据人工智能教学沙盘分享

大数据教学实训沙盘(TipDM-SP)是根据企业实际项目建设而成,并提供沙盘配套装置、软件以及教学实训资源。沙盘的作用主要有3个: 1、采集真实数据,解决教学中缺少真实数据的困扰; 2、形成从数据…

【C++】string模拟实现

各位读者老爷好,俺最近在学习string的一些知识。为了更好的了解string的结构,俺模拟实现了一个丐版string,有兴趣的老爷不妨垂阅!!! 目录 1.string类的定义 2.模拟实现成员函数接口 2.1.constructor&am…

c_str()函数 string类型转换成char*类型 C++实现

问题:在 class 的构造函数中,如果我们在类中初始化了 char * 类型,在调用构造函数时,如果直接传入字符串( string )类型,编译器会提出如下警告: 想要消除这个警告,就需要将 string 类型的变量转…

【vue3文件上传同时出现两个提示框,一个提示成功,一个提示失败,一个是用写死的,一个是接口返回的】

文件上传同时出现两个提示框,一个提示成功,一个提示失败,一个是用写死的,一个是接口返回的 原因: 接口返回的是字符串code200" 把判断的code码改为字符串的就好了

选择哪种Facebook广告目标更有效

在Facebook广告投放中,广告目标的选择决定了投放效果和转化率,但很多人往往忽略了这一步的细节。今天,我们来一起看看Facebook广告目标有哪些,以及如何精准选择! 1. 广告目标在投放中的重要性 广告目标不仅仅是一…

matlab实现主成分分析方法图像压缩和传输重建

原创 风一样的航哥 航哥小站 2024年11月12日 15:23 江苏 为了研究图像的渐进式传输技术,前文提到过小波变换,但是发现小波变换非常适合传输缩略图,实现渐进式传输每次传输的数据量不一样,这是因为每次变换之后低频成分大约是上一…

【缓存策略】你知道 Cache Aside(缓存旁路)这个缓存策略吗

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

稀疏视角CBCT重建的几何感知衰减学习|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 Geometry-Aware Attenuation Learning forSparse-View CBCT Reconstruction 稀疏视角CBCT重建的几何感知衰减学习 01 文献速递介绍 稀疏视角锥形束计算机断层扫描(CBCT)重建的几何感知学习方法 锥形束计算机断层扫描(CBCT&a…

电子应用产品设计方案-3:插座式自动温控器设计

一、设计 插座式自动温控器作为一种便捷的温度控制设备,在日常生活和工业应用中发挥着重要作用。它能够根据环境温度的变化自动控制连接设备的电源通断,实现对温度的精确调节和节能控制。本设计旨在提供一种功能强大、易于使用、安全可靠的插座式自动温控…