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 的优点
- 成熟稳定:Vuex 已经存在很长时间,社区和文档非常完善。
- 模块化支持:Vuex 提供了强大的模块化支持,可以将状态拆分成多个模块进行管理。
- 严格的约束:Vuex 的严格约束有助于保持代码的一致性和可维护性。
Vuex 的缺点
- 语法复杂:Vuex 的语法相对较为复杂,初学者可能需要一些时间来适应。
- 冗长的代码:由于 Vuex 的严格约束,代码可能会变得冗长和重复。
Pinia 的优点
- 简洁直观:Pinia 的 API 设计更加简洁和直观,降低了学习曲线。
- 更好的类型支持:Pinia 提供了更好的 TypeScript 支持,使得开发体验更佳。
- 灵活性高:Pinia 提供了更多的灵活性,可以更方便地进行状态管理。
Pinia 的缺点
- 相对较新:Pinia 相对于 Vuex 来说较为新颖,社区和文档可能不如 Vuex 完善。
- 生态系统:由于 Pinia 较新,相关的插件和工具可能不如 Vuex 丰富。
选择建议
- 如果你是一个 Vue 的新手,或者希望快速上手一个状态管理库,Pinia 可能是一个更好的选择。
- 如果你正在维护一个老的 Vue 项目,或者需要一个成熟稳定的解决方案,Vuex 可能更适合你。
- 如果你使用 TypeScript 开发,Pinia 提供了更好的类型支持,可能会让你的开发体验更好。
无论选择哪一个库,都建议你深入理解它们的核心概念和使用方式,并根据项目需求进行合理的选择。
参考资料
- Vuex 官方文档
- Pinia 官方文档
通过对 Vuex 和 Pinia 的深入剖析和对比,希望你能更好地理解这两个状态管理库,并在实际项目中做出最佳选择。Happy coding!
推荐一个AI网站,
免费使用豆包AI模型,快去白嫖👉海鲸AI
相关文章:
Vue 状态管理深入研究:Vuex 和 Pinia 的原理与实践对比
推荐一个AI网站,免费使用豆包AI模型,快去白嫖👉海鲸AI 👋 引言 在 Vue.js 应用程序中,状态管理是一个至关重要的方面。它有助于集中管理应用的状态,使组件之间的数据共享更加高效和可维护。Vuex 和 Pinia …...
【三数之和】python,排序+双指针
暴力搜索3次方的时间复杂度,大抵超时 遇到不会先排序 排序双指针 上题解 照做 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通信实现(服务器端) 案例 // 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自动化测试环境,我自己的版本信息
教程来自:Appium原理与安装 - 白月黑羽 我的软件的版本: 安装是选择为自己安装而不是选all user pip install appium-python-client命令在项目根目录下安装appium-python-client sdk的话最简单的安装方式就是去Android官网下一个android studio然后在…...
【讲解下Web前端三大主流的框架】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
视频监控平台AS-V1000产品介绍:账户或用户数据的导入和导出功能介绍
目录 一、功能描述 (一)导入功能定义 (二)导出功能定义 二、用户数据的导入导出的作用 三、AS-V1000新版本的导出和导入功能介绍 (一)功能主界面 (二)导出功能 1、导出操作 …...
markdown画时序图的时候,如何自动显示每一条时序的序号
1: 现象描述 今天画时序图的时候,发现时序上面没有显示序号,看起来不够清晰,只有单纯的说明; 如下图所示 刚测试CSDN的时序图,默认是带序号的,看起来和实际使用的markdown工具有关系; 2:解决办…...
朴素贝叶斯
经典三门问题 问题 一种说法(直觉派) 另一种说法(贝叶斯派) 注意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…...
唐山无人机航拍,唐山无人机建模,唐山数据孪生
随着数字经济发展,各地逐渐兴起了无人机低空经济;尤其是无人机航拍,无人机建模;目前技术很成熟;比如水利部提出的数字孪生,四预的实现,都要通过无人机采集底层数据; 目前无人机建模…...
vue中分页查询的实现
在 Vue 中实现分页查询可以提升大型数据集的加载和显示效率。本文将逐步介绍如何使用 Vuex 状态管理和 axios HTTP 请求库来实现 Vue 分页查询。 1. 在 Vuex 中创建分页状态 首先,在 Vuex 状态管理中创建分页状态,该状态将存储每页的记录数、当前页码和…...
类 和 对象(二)
构造方法 接上篇,若每次都想下面的setDate方法给对象初始化,未免比较麻烦,那有什么方法可以让初始化更加简便呢? 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(代码审计) 题目 访问source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…...
力扣爆刷第145天之图论五连刷(dfs和bfs)
力扣爆刷第145天之图论五连刷(dfs和bfs) 文章目录 力扣爆刷第145天之图论五连刷(dfs和bfs)总结一、797. 所有可能的路径二、200. 岛屿数量三、695. 岛屿的最大面积四、1020. 飞地的数量五、130. 被围绕的区域 总结 dfs是一条路走…...
Host头攻击-使用加密和身份验证机制
使用加密和身份验证机制,即安装合适的安全工具和软件,是确保Web服务器安全性的重要步骤。这种方法涉及使用各种安全工具来检测、预防、监控和响应潜在的安全威胁。以下是对第6种方法的详细讲解,包括一些常见的安全工具和软件的示例。 1. 防火…...
衍生品赛道的 UniSwap:SynFutures 或将成为行业领军者
经过一个周期的发展,DeFi 已经成为基于区块链构建的最成功的去中心化应用,并彻底改变了加密市场的格局。加密货币交易开始逐步从链下转移到链上,并从最初简单的 Swap 到涵盖借贷、Staking、衍生品交易等广泛的生态系统。 在 DeFi 领域&#x…...
TypeScript中的`let`、`const`、`var`区别:变量声明的规范与实践
TypeScript中的let、const、var区别:变量声明的规范与实践 引言 在TypeScript中,变量声明是代码编写的基础部分。let、const、var 是三种用于变量声明的关键字,它们各自有不同的作用域规则和可变性特点。 基础知识 作用域:变量…...
【python】python商家会员数据分析可视化(源码+数据集+课程报告论文)
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…...
Python限制输入的数范围
在Python中,我们可以使用多种方法来限制用户输入的数值范围。 1.使用while循环和try-except语句的方法 以下是一个使用while循环和try-except语句的示例,该示例将要求用户输入一个在指定范围内的整数。 假设我们要限制用户输入的数在1到100之间&#…...
postman都有哪些功能?
接口测试 可以方便地发送 HTTP 请求,包括各种方法(GET、POST、PUT、DELETE 等),并查看响应结果。 参数设置 能够灵活设置请求的参数,如查询参数、请求头、请求体等。 环境管理 支持创建不同的环境,方便…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
在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…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
