浅谈vuex和pinia的区别

文章目录

  • 介绍
  • 核心概念
  • 用法区别
    • 导入
    • state
    • getters
    • Mutations
    • Actions
  • 工作原理
  • 优缺点

本篇文章主要展示vuex和pinia的区别,详情使用请看博主其他文章或者官方文档

vuex官网:https://vuex.vuejs.org/zh/guide/
pinia官网:https://pinia.vuejs.org/zh/introduction.html

介绍

VueX:VueX 是 Vue.js 官方提供的状态管理库。它基于 Flux 架构模式,提供了一个中央状态存储器来管理应用程序中的状态。VueX 可以通过 mutations、actions 和 getters 等概念来修改和处理状态的变更,同时具有强大的工具和插件支持。

Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。如果你熟悉组合式 API 的话,你可能会认为可以通过一行简单的 export const state = reactive({}) 来共享一个全局状态。对于单页应用来说确实可以,但如果应用在服务器端渲染,这可能会使你的应用暴露出一些安全漏洞。 而如果使用 Pinia,即使在小型单页应用中,你也可以获得如下功能:

  • Devtools 支持
  • 追踪 actions、mutations 的时间线
  • 在组件中展示它们所用到的 Store
  • 让调试更容易的 Time travel
  • 热更新
  • 不必重载页面即可修改 Store
  • 开发时可保持当前的 State
  • 插件:可通过插件扩展 Pinia 功能
  • 为 JS 开发者提供适当的 TypeScript 支持以及自动补全功能。
  • 支持服务端渲染

核心概念

vuex:State,Getter,Mutation,Action,Module
pinia:State,Getter,Action,store

显而易见,pinia去除了Mutation

用法区别

导入

vuex

//store.js
import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);

pinia

//main.js
import { createPinia } from 'pinia';
import { createApp } from 'vue';
import App from './App.vue';const app = createApp(App);
const pinia = createPinia();
app.use(pinia);
app.mount('#app');
// store.js
import { defineStore } from 'pinia';

state

vuex

const store = new Vuex.Store({state: {count: 0}})

组件中使用
直接使用:

<template><p>{{ $store.state.count }}</p>
</template>

通过映射

import { mapState} from 'vuex';export default {computed: {...mapState(['count'])}}

pinia

export const useCounterStore = defineStore('counter', {state: () => ({count: 0,name: 'Pinia'}),})

组件中简单使用

<template><div><p>Count: {{ counterStore.count }}</p><p>name: {{ counterStore.name }}</p></div>
</template><script setup>
import { useCounterStore } from '@/stores/counter';
const counterStore = useCounterStore();
</script>

getters

vuex

const store = new Vuex.Store({getters: {doubleCount: state => state.count * 2}
});

组件中使用
简单使用

$store.getters.doubleCount

使用映射

import { mapGetters} from 'vuex';computed: {...mapGetters(['doubleCount'])},

pinia

store.js
export const useCounterStore = defineStore('counter', {getters: {doubleCount: (state) => state.count * 2},})

在组件中使用

<template><div><p>Double Count: {{ counterStore.doubleCount }}</p></div>
</template><script setup>
import { useCounterStore } from '@/stores/counter';
const counterStore = useCounterStore();
</script>

Mutations

mutations 是唯一能够直接修改 state 的方法,Vuex 强制要求使用同步函数来更改状态。每个 mutation 都有一个字符串类型的事件类型(type)和一个回调函数(handler),回调函数的第一个参数是 state。

const store = new Vuex.Store({state: {count: 0},mutations: {increment(state) {state.count++;}}
});

调用

store.commit('increment');

pinia没有mutations属性

Actions

vuex
actions 用于提交 mutations,但不同的是,actions 支持异步操作。在 actions 中执行异步操作(如 API 请求)后,再通过 commit 来触发 mutation 以修改状态。

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

在组件使用

<template><button @click="incrementAsync">Async Increment</button>
</template><script>
export default {methods: {incrementAsync() {this.$store.dispatch('incrementAsync');}}
};
</script>

当然,如果actions多的话,你也可以选择使用映射

import { mapActions } from 'vuex';methods: {...mapMutations(['increment']),...mapActions(['asyncIncrement'])}

pinia

// store.js
import { defineStore } from 'pinia';export const useStore = defineStore('main', {state: () => ({count: 0}),getters: {doubleCount: (state) => state.count * 2},actions: {increment() {this.count++;},})

在组件中使用

<template><div><button @click="counterStore.increment">Increment</button></div>
</template><script setup>
import { useCounterStore } from '@/stores/counter';
const counterStore = useCounterStore();
</script>

工作原理

vuex:
Vuex 基于以下机制来实现其核心功能:
响应式的 state:Vuex 利用 Vue.js 自身的响应式系统来确保 state 的变化会自动引发界面的更新。
单一状态树:Vuex 通过单一的状态树将所有的状态集中管理,每个组件都可以通过这个状态树访问和修改数据,避免了多层嵌套传递数据的问题。
不可变的 state:只有通过提交 mutation 才能修改 state,这种方式确保了状态的可追踪性。通过 Vue 开发工具,开发者可以轻松地查看每一次 mutation 是如何改变状态的。
在这里插入图片描述
pinia

  1. 创建 Pinia 实例:
    createPinia() 用于生成 Pinia 实例,这个实例你可以将其看作为一个全局的 store 容器,用来保存所有的 Vuex store。

  2. 创建 Store:
    使用 createStore 可以创建一个新的 store,这个 store 可看做是一个独立的状态管理空间,其中包含了 state、getters 和 actions,被创建的 store 实例会被自动添加到 Pinia 实例中。

  3. 使用 Store:
    我们通过在组件中调用用 createStore 创建的 store 函数,来获取对应的 Pinia store 的实例。然后,我们就可以访问其中的 state、getters,或者执行 actions 里定义的方法。

  4. 监听 Store 变化:
    我们可以使用 Vue 的 watchwatchEffect 函数来监听 store 中 state 或 getters 的变化,以便在这些内容改变时执行相应的操作。

  5. 整合到 Vue App 中:
    创建的 Pinia 实例需要使用 app.use() 安装到 Vue App 中,以便 Pinia 与 Vue App 一同工作,提供全局的状态管理能力。

优缺点

Vuex 的优点

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

Vuex 的缺点

  1. 语法复杂:Vuex 的语法相对较为复杂,初学者可能需要一些时间来适应。

  2. 冗长的代码:由于 Vuex 的严格约束,代码可能会变得冗长和重复。

Pinia 的优点

  1. 简洁的 API:相比 Vuex,Pinia 不再需要 mutations,状态的修改可以直接通过 actions 或者直接修改 state,减少了模板代码,使状态管理更直观。
  2. 支持组合式 API:Pinia 完美集成了 Vue 3 的组合式 API(Composition API),和 setup
    直接结合使用,减少了复杂性。
  3. TypeScript 支持:Pinia 原生支持 TypeScript,提供类型推断和自动完成,让开发者在使用 Pinia
    时更加方便,减少了手动添加类型的麻烦。
  4. 模块自动化:不需要像 Vuex 那样手动注册模块,Pinia 的 store 是独立的,自动按需加载,无需管理模块的注册和取消注册。
  5. 开发工具支持:Pinia 支持 Vue Devtools,并提供了时间旅行和状态快照功能,方便调试。

Pinia 的缺点

  1. 社区支持较少:虽然 Pinia 是官方推荐的 Vue 3 状态管理工具,但它相对于 Vuex
    来说是较新的库,社区资源和插件的生态系统还没有 Vuex 丰富。
  2. 学习成本:对于已经熟悉 Vuex 的开发者,迁移到 Pinia
    需要一些学习时间,尤其是在大型项目中迁移状态管理可能会涉及较大的代码修改。
  3. 不支持 Vue 2:Pinia 是专门为 Vue 3 设计的,无法与 Vue 2 一起使用。如果需要在 Vue 2中使用状态管理,仍然需要使用 Vuex。
  4. 性能:虽然 Pinia 的性能相较 Vuex 有所提升,但在非常大规模的项目中,状态管理的性能瓶颈问题可能仍然存在。此时需要配合 Vue
    的响应式原理和一些手动优化来保证性能。

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

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

相关文章

python的json库的基本应用

总目录 一、json库的介绍 Python 的 json 库是一个非常常用的库&#xff0c;用于处理 JSON 数据。以下是 json 库的基本功能&#xff1a; 编码&#xff08;将 Python 对象转换为 JSON 字符串&#xff09; 解码&#xff08;将 JSON 字符串转换为 Python 对象&#xff09; 读写文…

R language 关于二维平面直角坐标系的制作

昨天说参与了机器学习的学习&#xff0c;今天又来讲讲这一天的学习&#xff0c;主要是做简单的数据分析和展示、 首先&#xff0c;基于系能源汽车的流行&#xff0c;做了一组图&#xff0c;如下&#xff1a; DATASET&#xff1a; 1.比亚迪海鸥&#xff0c;磷酸铁锂&#xff0c;…

密码学简要介绍

密码学是研究编制密码和破译密码的技术科学&#xff0c;它研究密码变化的客观规律&#xff0c;主要包括编码学和破译学两大部分。 一、定义与起源 定义&#xff1a;密码学是研究如何隐密地传递信息的学科&#xff0c;在现代特别指对信息以及其传输的数学性研究&#xff0c;常被…

JVM原理和垃圾回收装置

JVM组成 1. 类加载器&#xff0c;用来把字节码文件加载进入到runtime区域 2. 执行引擎: 用来执行.class中的指令 包含即时编译器和垃圾回收装置 3. 运行时区域就是jvm内存 先由编译器把.java文件&#xff0c;编译成.class文件 此时底层os仍然看不懂&#xff0c;所以需要把…

解决go run main.go executable file not found in %PATH%

项目场景&#xff1a; 命令行执行go run 都会报 executable file not found in %PATH% 问题描述 最近我发现&#xff0c;我通过命令行&#xff0c;无论是跑什么go文件&#xff0c;都会出现这个错误。但是我通过我的IDE就能跑&#xff0c;于是我也没有管它。 但是最近&#x…

go中Println和Printf的区别

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 go中Println和Printf的区别 package mainimport ( "fmt" )//TIP To run your code, right-click the c…

矩阵NFC碰一碰发视频源码开发技术解析,支持OEM

一、引言 在当今数字化营销的热潮中&#xff0c;矩阵爆店码成为了助力商家引流推广的重要工具。开发矩阵爆店码的源码涉及到多种技术的综合运用&#xff0c;本文将深入探讨其开发过程中的关键技术要点。 二、技术选型 &#xff08;一&#xff09;后端开发技术 编程语言 选择一…

零基础嵌入式工程师成长路线以及如何学习嵌入式操作系统?

以下是一条零基础嵌入式工程师的成长路线&#xff1a; **一、入门阶段&#xff08;3 - 6个月&#xff09;** 1. **学习基础知识** - **编程语言**&#xff1a; C语言是嵌入式开发的基础。学习C语言的基本语法&#xff0c;包括数据类型&#xff08;如整型、字符型、浮点型&am…

数据结构之二叉树前序,中序,后序习题分析(递归图)

1.比较相同的树 二叉树不能轻易用断言&#xff0c;因为树一定有空 2.找结点值 3.单值二叉树 4.对称二叉树 5.前序遍历

C++设计模式结构型模式———组合模式

文章目录 一、引言二、组合模式三、总结 一、引言 组合模式是一种结构型设计模式&#xff0c; 可以使用它将对象组合成树状结构&#xff0c; 并且能像使用独立对象一样使用它们。代码实现中涉及了递归调用。组合模式与传统上的“类与类之间的组合关系”没有关联&#xff0c;不…

电子商城购物平台的设计与开发+ssm(lw+演示+源码+运行)

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;电子商城购物平台小程序被用户普遍使用&#xff0c;为方便…

用离线的方式(使用U盘)将Qt文件装载到开发板

第一步&#xff1a;打开虚拟机软件&#xff0c;加载Linux系统进入桌面 桌面 第二步&#xff1a;将U盘插入电脑&#xff0c;挂载到虚拟机中选择连接到虚拟机&#xff0c;虚拟机名称为alientek U盘接入虚拟机 第三步&#xff1a;将mp157开发板一端连接在USB_TTL接口&#xff…

Android 字节飞书面经

Android 字节飞书面经 文章目录 Android 字节飞书面经一面二面 一面 1. 线程是进程的一部分&#xff0c;一个线程只能属于一个进程&#xff0c;而一个进程可以有多个线程&#xff0c;但至少有一个线程。 2. 根本区别&#xff1a;进程是操作系统资源分配的基本单位&#xff0c;…

针对告警数量、告警位置、告警类型等参数进行统计,并做可视化处理的智慧能源开源了。

一、简介 AI视频监控平台, 是一款功能强大且简单易用的实时算法视频监控系统。愿景在最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;减少企业级应用约 95%的开发成本&#xff0c;在强大视频算…

Linux系统的入门使用

前言一、常用操作以及概念 快捷键求助关机PATHsudo包管理工具发行版VIM 三个模式GNU开源协议 二、磁盘 磁盘接口磁盘的文件名 三、分区 分区表开机检测程序 四、文件系统 分区与文件系统组成文件读取磁盘碎片blockinode目录日志挂载目录配置 五、文件 文件属性文件与目录的基本…

软考系统分析师知识点三二:案例知识点三

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间&#xff1a;11月9日。 倒计时&#xff1a;5天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第三阶段&#xff1a;总结案例知识点&#xff0c;并作为论文的框架知识…

无人机维护保养、部件修理更换技术详解

无人机作为一种精密的航空设备&#xff0c;其维护保养和部件修理更换是确保飞行安全、延长使用寿命的重要环节。以下是对无人机维护保养、部件修理更换技术的详细解析&#xff1a; 一、无人机维护保养技术 1. 基础构造理解&#xff1a; 熟悉无人机的基本构造&#xff0c;包括…

高校大数据实训平台介绍

高校大数据实验室架构 具体实训平台介绍 编程实训平台 1、大数据开发实训平台 大数据开发实训平台是面向实训课和课后训练的编程实训平台&#xff0c;平台底层基于Docker技术&#xff0c;采用容器云部署方案&#xff0c;预装大数据相关课程教学所需的实训环境…

SQL基础—2

1.左外连接查询&#xff08;left join on&#xff09; A - A∩B 左外连接查询两张表条件都满足的数据&#xff0c;以及左边表(A表)存在的数据(以左边表为主查询表)。 A - A∩B (A和A交B)。 示例&#xff1a;使用左外连接将dept表作为主查询表&#xff0c;查询员工编号、员工姓…

R语言贝叶斯:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析

原文链接&#xff1a;R语言贝叶斯&#xff1a;INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247625527&idx8&snba4e50376befd94022519152609ee8d0&chksmfa8daad0cdfa23c6…