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

Vue 状态管理深入研究:Vuex 和 Pinia 的原理与实践对比

推荐一个AI网站,免费使用豆包AI模型,快去白嫖👉海鲸AI

👋 引言

在 Vue.js 应用程序中,状态管理是一个至关重要的方面。它有助于集中管理应用的状态,使组件之间的数据共享更加高效和可维护。Vuex 和 Pinia 是两个常用的 Vue 状态管理库,它们都提供了强大的功能来帮助我们更好地管理应用状态。本文将深入剖析 Vuex 和 Pinia,从原理到实践进行全面对比。

📌 Vuex 基础知识

核心构成要素

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 的核心构成要素包括:

  • State(状态):存储应用的状态。
  • Getter(获取器):从状态中派生出状态。
  • Mutation(突变):同步地更改状态。
  • Action(动作):提交 mutation,可以包含异步操作。
  • Module(模块):将状态和变更分割成模块。

示例代码

// store.js
import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);const store = new Vuex.Store({state: {count: 0},getters: {doubleCount: state => state.count * 2},mutations: {increment (state) {state.count++;}},actions: {asyncIncrement ({ commit }) {setTimeout(() => {commit('increment');}, 1000);}}
});export default store;// 在组件中使用 Vuex
<template><div><p>{{ count }}</p><p>{{ doubleCount }}</p><button @click="increment">Increment</button><button @click="asyncIncrement">Async Increment</button></div>
</template><script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex';export default {computed: {...mapState(['count']),...mapGetters(['doubleCount'])},methods: {...mapMutations(['increment']),...mapActions(['asyncIncrement'])}
};
</script>

📌 Pinia 基础知识

核心构成要素

Pinia 是 Vue 的新一代状态管理库,它提供了更简洁的 API 和更好的开发体验。Pinia 的核心构成要素包括:

  • State(状态):存储应用的状态。
  • Getter(获取器):从状态中派生出状态。
  • Action(动作):可以包含同步和异步操作。
  • Store(存储):定义状态、获取器和动作的地方。

示例代码

// store.js
import { defineStore } from 'pinia';export const useStore = defineStore('main', {state: () => ({count: 0}),getters: {doubleCount: (state) => state.count * 2},actions: {increment() {this.count++;},asyncIncrement() {setTimeout(() => {this.increment();}, 1000);}}
});// 在组件中使用 Pinia
<template><div><p>{{ count }}</p><p>{{ doubleCount }}</p><button @click="increment">Increment</button><button @click="asyncIncrement">Async Increment</button></div>
</template><script>
import { useStore } from './store';export default {setup() {const store = useStore();return {...store};}
};
</script>

📌 Vuex 与 Pinia 的区别

  • 语法和结构:Vuex 的语法相对较为复杂,而 Pinia 的语法更加简洁和直观。
  • 模块系统:Vuex 支持模块系统,可以将状态拆分成多个模块进行管理,而 Pinia 也提供了类似的功能,但更加灵活和易于使用。
  • 类型支持:Pinia 提供了更好的类型支持,可以在代码中获得更好的类型推断和提示。
  • 开发体验:Pinia 在开发体验上更加友好,提供了更多的辅助函数和工具,使开发更加高效。

📌 使用示例与对比

Vuex 示例

// store.js
import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);const store = new Vuex.Store({state: {message: 'Hello Vuex'},mutations: {setMessage(state, payload) {state.message = payload;}},actions: {updateMessage({ commit }, payload) {commit('setMessage', payload);}}
});export default store;// 在组件中使用 Vuex
<template><div><p>{{ message }}</p><input v-model="newMessage" placeholder="Enter new message"><button @click="updateMessage(newMessage)">Update Message</button></div>
</template><script>
import { mapState, mapMutations, mapActions } from 'vuex';export default {data() {return {newMessage: ''};},computed: {...mapState(['message'])},methods: {...mapMutations(['setMessage']),...mapActions(['updateMessage'])}
};
</script>

Pinia 示例

// store.js
import { defineStore } from 'pinia';export const useStore = defineStore('main', {state: () => ({message: 'Hello Pinia'}),actions: {setMessage(payload) {this.message = payload;},updateMessage(payload) {this.setMessage(payload);}}
});// 在组件中使用 Pinia
<template><div><p>{{ message }}</p><input v-model="newMessage" placeholder="Enter new message"><button @click="updateMessage(newMessage)">Update Message</button></div>
</template><script>
import { useStore } from './store';export default {setup() {const store = useStore();const newMessage = ref('');return {...store,newMessage};}
};
</script>

📌 总结

Vuex 和 Pinia 都是优秀的 Vue 状态管理库,它们在功能和性能上都有出色的表现。选择哪一个取决于你的项目需求和个人偏好。以下是对两者的一些总结和建议:

Vuex 的优点

  1. 成熟稳定:Vuex 已经存在很长时间,社区和文档非常完善。
  2. 模块化支持:Vuex 提供了强大的模块化支持,可以将状态拆分成多个模块进行管理。
  3. 严格的约束:Vuex 的严格约束有助于保持代码的一致性和可维护性。

Vuex 的缺点

  1. 语法复杂:Vuex 的语法相对较为复杂,初学者可能需要一些时间来适应。
  2. 冗长的代码:由于 Vuex 的严格约束,代码可能会变得冗长和重复。

Pinia 的优点

  1. 简洁直观:Pinia 的 API 设计更加简洁和直观,降低了学习曲线。
  2. 更好的类型支持:Pinia 提供了更好的 TypeScript 支持,使得开发体验更佳。
  3. 灵活性高:Pinia 提供了更多的灵活性,可以更方便地进行状态管理。

Pinia 的缺点

  1. 相对较新:Pinia 相对于 Vuex 来说较为新颖,社区和文档可能不如 Vuex 完善。
  2. 生态系统:由于 Pinia 较新,相关的插件和工具可能不如 Vuex 丰富。

选择建议

  • 如果你是一个 Vue 的新手,或者希望快速上手一个状态管理库,Pinia 可能是一个更好的选择。
  • 如果你正在维护一个老的 Vue 项目,或者需要一个成熟稳定的解决方案,Vuex 可能更适合你。
  • 如果你使用 TypeScript 开发,Pinia 提供了更好的类型支持,可能会让你的开发体验更好。

无论选择哪一个库,都建议你深入理解它们的核心概念和使用方式,并根据项目需求进行合理的选择。

参考资料

  • Vuex 官方文档
  • Pinia 官方文档

通过对 Vuex 和 Pinia 的深入剖析和对比,希望你能更好地理解这两个状态管理库,并在实际项目中做出最佳选择。Happy coding!

推荐一个AI网站,免费使用豆包AI模型,快去白嫖👉海鲸AI

相关文章:

Vue 状态管理深入研究:Vuex 和 Pinia 的原理与实践对比

推荐一个AI网站&#xff0c;免费使用豆包AI模型&#xff0c;快去白嫖&#x1f449;海鲸AI &#x1f44b; 引言 在 Vue.js 应用程序中&#xff0c;状态管理是一个至关重要的方面。它有助于集中管理应用的状态&#xff0c;使组件之间的数据共享更加高效和可维护。Vuex 和 Pinia …...

【三数之和】python,排序+双指针

暴力搜索3次方的时间复杂度&#xff0c;大抵超时 遇到不会先排序 排序双指针 上题解 照做 class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:res[]nlen(nums)#排序降低复杂度nums.sort()k0#留两个位置给双指针i,jfor k in range(n-2):if nums[k]…...

TCP通信实现(服务端与客户端)

TCP通信实现&#xff08;服务器端) 案例 // TCP 通信的服务器端#include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h>int main() {// 1.创建socket(用于监听的套接字)int lfd socket(AF_…...

安装appium自动化测试环境,我自己的版本信息

教程来自&#xff1a;Appium原理与安装 - 白月黑羽 我的软件的版本&#xff1a; 安装是选择为自己安装而不是选all user pip install appium-python-client命令在项目根目录下安装appium-python-client sdk的话最简单的安装方式就是去Android官网下一个android studio然后在…...

【讲解下Web前端三大主流的框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…...

视频监控平台AS-V1000产品介绍:账户或用户数据的导入和导出功能介绍

目录 一、功能描述 &#xff08;一&#xff09;导入功能定义 &#xff08;二&#xff09;导出功能定义 二、用户数据的导入导出的作用 三、AS-V1000新版本的导出和导入功能介绍 &#xff08;一&#xff09;功能主界面 &#xff08;二&#xff09;导出功能 1、导出操作 …...

markdown画时序图的时候,如何自动显示每一条时序的序号

1: 现象描述 今天画时序图的时候&#xff0c;发现时序上面没有显示序号&#xff0c;看起来不够清晰&#xff0c;只有单纯的说明; 如下图所示 刚测试CSDN的时序图&#xff0c;默认是带序号的&#xff0c;看起来和实际使用的markdown工具有关系&#xff1b; 2&#xff1a;解决办…...

朴素贝叶斯

经典三门问题 问题 一种说法(直觉派) 另一种说法(贝叶斯派) 注意P(B)1, 已经知道路人抽中的就是绿豆 三门问题在网上争端比较大,分为直觉派和贝叶斯派,最后一个程序员出来写程序跑了一遍,发现就是贝叶斯派 朴素贝叶斯的直观理解 在X的条件下分别等于0~9的概率 注意之前我们讲的…...

【软件设计师】——10.面向对象技术

目录 10.1 基本概念 10.2设计原则 10.3 设计模式的概念与分类 10.4 创建型模式 10.4.1 Singleton 单例模式 10.4.2 Builder 构建器模式 10.4.3 Abstract Factory 抽象工厂模式 10.4.4 Prototype原型模式 10.4.5 Factory Method工厂方法模式 10.5 结构型模式 10.5.1 A…...

唐山无人机航拍,唐山无人机建模,唐山数据孪生

随着数字经济发展&#xff0c;各地逐渐兴起了无人机低空经济&#xff1b;尤其是无人机航拍&#xff0c;无人机建模&#xff1b;目前技术很成熟&#xff1b;比如水利部提出的数字孪生&#xff0c;四预的实现&#xff0c;都要通过无人机采集底层数据&#xff1b; 目前无人机建模…...

vue中分页查询的实现

在 Vue 中实现分页查询可以提升大型数据集的加载和显示效率。本文将逐步介绍如何使用 Vuex 状态管理和 axios HTTP 请求库来实现 Vue 分页查询。 1. 在 Vuex 中创建分页状态 首先&#xff0c;在 Vuex 状态管理中创建分页状态&#xff0c;该状态将存储每页的记录数、当前页码和…...

类 和 对象(二)

构造方法 接上篇&#xff0c;若每次都想下面的setDate方法给对象初始化&#xff0c;未免比较麻烦&#xff0c;那有什么方法可以让初始化更加简便呢&#xff1f; public void setDate(int year, int month, int day){this.year year;this.month month;this.day day;}答&#…...

buu[HCTF 2018]WarmUp(代码审计)

buu[HCTF 2018]WarmUp&#xff08;代码审计&#xff09; 题目 访问source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…...

力扣爆刷第145天之图论五连刷(dfs和bfs)

力扣爆刷第145天之图论五连刷&#xff08;dfs和bfs&#xff09; 文章目录 力扣爆刷第145天之图论五连刷&#xff08;dfs和bfs&#xff09;总结一、797. 所有可能的路径二、200. 岛屿数量三、695. 岛屿的最大面积四、1020. 飞地的数量五、130. 被围绕的区域 总结 dfs是一条路走…...

Host头攻击-使用加密和身份验证机制

使用加密和身份验证机制&#xff0c;即安装合适的安全工具和软件&#xff0c;是确保Web服务器安全性的重要步骤。这种方法涉及使用各种安全工具来检测、预防、监控和响应潜在的安全威胁。以下是对第6种方法的详细讲解&#xff0c;包括一些常见的安全工具和软件的示例。 1. 防火…...

衍生品赛道的 UniSwap:SynFutures 或将成为行业领军者

经过一个周期的发展&#xff0c;DeFi 已经成为基于区块链构建的最成功的去中心化应用&#xff0c;并彻底改变了加密市场的格局。加密货币交易开始逐步从链下转移到链上&#xff0c;并从最初简单的 Swap 到涵盖借贷、Staking、衍生品交易等广泛的生态系统。 在 DeFi 领域&#x…...

TypeScript中的`let`、`const`、`var`区别:变量声明的规范与实践

TypeScript中的let、const、var区别&#xff1a;变量声明的规范与实践 引言 在TypeScript中&#xff0c;变量声明是代码编写的基础部分。let、const、var 是三种用于变量声明的关键字&#xff0c;它们各自有不同的作用域规则和可变性特点。 基础知识 作用域&#xff1a;变量…...

【python】python商家会员数据分析可视化(源码+数据集+课程报告论文)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…...

Python限制输入的数范围

在Python中&#xff0c;我们可以使用多种方法来限制用户输入的数值范围。 1.使用while循环和try-except语句的方法 以下是一个使用while循环和try-except语句的示例&#xff0c;该示例将要求用户输入一个在指定范围内的整数。 假设我们要限制用户输入的数在1到100之间&#…...

postman都有哪些功能?

接口测试 可以方便地发送 HTTP 请求&#xff0c;包括各种方法&#xff08;GET、POST、PUT、DELETE 等&#xff09;&#xff0c;并查看响应结果。 参数设置 能够灵活设置请求的参数&#xff0c;如查询参数、请求头、请求体等。 环境管理 支持创建不同的环境&#xff0c;方便…...

CAN总线电压测试避坑指南:用示波器实测显性/隐性电平,别再被CAN_H和CAN_L的命名误导了

CAN总线电压测试实战手册&#xff1a;从示波器设置到波形解读的完整指南 实验室里&#xff0c;工程师小王盯着示波器屏幕上跳动的波形皱起了眉头——按照教科书上的说法&#xff0c;CAN_H电压应该始终高于CAN_L&#xff0c;但眼前的波形却显示在总线空闲时CAN_L电压反而更高。这…...

手把手教你用N32G435的DMA‘传输过半中断’实现软件双缓冲(附2.5M波特率测试代码)

N32G435 DMA传输过半中断实现高负载串口通信的工程实践 在嵌入式系统开发中&#xff0c;高效处理高速串口数据流一直是工程师面临的挑战。当数据速率达到兆波特级别时&#xff0c;传统的中断驱动方式往往会导致CPU资源耗尽&#xff0c;系统响应迟缓。本文将深入探讨如何利用N32…...

UniApp视频模块深度配置:云打包与Android离线打包的差异详解与选型建议

UniApp视频模块深度配置&#xff1a;云打包与Android离线打包的差异详解与选型建议 在移动应用开发领域&#xff0c;视频功能已成为提升用户体验的关键要素。UniApp作为跨平台开发框架&#xff0c;其VideoPlayer模块的集成方式直接影响着开发效率和最终产品质量。面对云打包与离…...

面部SDF阴影锯齿问题的探索

近期做的一些工作涉及到面部SDF阴影&#xff0c;网上普遍做法是不做插值&#xff0c;直接Step硬性裁剪&#xff0c;不是很理解为什么不用插值&#xff0c;于是我通过SmoothStep做了简单修改&#xff0c;看下效果。 看上去还可以是因为gif有压缩&#xff0c;但面部SDF阴影做插值…...

【NotebookLM效应量计算实战指南】:20年统计学专家亲授3大避坑法则与5步精准计算流程

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;NotebookLM效应量计算的核心概念与适用场景 NotebookLM 是 Google 推出的基于用户上传文档进行语义理解与推理的实验性 AI 工具。其“效应量计算”并非内置统计模块&#xff0c;而是指用户在利用 NotebookLM 对…...

开源Agent框架能跑通Demo,但离企业生产还差五个能力

2026年AI行业的现象很有意思。开源社区里Agent框架层出不穷&#xff0c;每隔几周就有一个新项目冲上GitHub热榜&#xff0c;演示视频做得赏心悦目——AI Agent流畅地调用工具、搜索网页、生成报告&#xff0c;评论区一片惊叹。但如果你去问那些真正在生产环境中大规模部署Agent…...

我踩了N多劣质工具坑从嫌弃到真香,2026这款语音生成软件真后悔没早用

上周刚下班被leader留下来整理2小时项目评审会纪要&#xff0c;对着录音逐句暂停记&#xff0c;熬到八点半还错漏了三个核心需求&#xff1b;上个月做行业专家访谈&#xff0c;3小时录音来回听&#xff0c;耳朵疼得发胀还漏了嘉宾的核心观点&#xff1b;报了线上的产品进阶课&a…...

国产多模态大模型 vs DALL-E:本土化突围与全球竞技

国产多模态大模型 vs DALL-E&#xff1a;本土化突围与全球竞技 引言 在AIGC浪潮席卷全球的当下&#xff0c;OpenAI的DALL-E系列无疑是图像生成领域的耀眼明星&#xff0c;其惊人的创造力和对自然语言的深刻理解&#xff0c;定义了“文生图”的新高度。然而&#xff0c;当我们聚…...

pytorch-adapter:让 PyTorch 模型“无缝”跑在昇腾 NPU 上

pytorch-adapter&#xff1a;让 PyTorch 模型“无缝”跑在昇腾 NPU 上 之前帮朋友看 PyTorch 模型适配 CANN 的代码&#xff0c;发现他手写了很多适配层——把自己的 MyModel 一层层翻译成 AscendCL 接口&#xff0c;光写适配层就写了 2,000 行。 我告诉他&#xff1a;不用手…...

出海技术团队的沟通挑战:不是语言问题,是文化差异

当软件测试从业者成为“出海先锋”&#xff0c;我们最先打包进行李箱的是什么&#xff1f;是精通JIRA操作&#xff0c;是熟练Python脚本&#xff0c;是深谙CI/CD流水线。我们自信满满&#xff0c;以为能用一口流利的英语、一套标准的ISTQB术语&#xff0c;在全球化的技术团队中…...