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

聊聊Vuex vs Pinia

一、Vuex 的核心概念

Vuex 有五个主要模块:

  1. State(状态)

    • 就是数据的存放地,相当于一个全局的 data。

    • 组件通过 this.$store.state.xxx 或 mapState 辅助函数来访问。

  2. Getter(派生状态)

    • 类似组件中的 computed,对 state 进行二次计算。

    • 比如把购物车的商品总价计算出来。

  3. Mutation(同步修改状态)

    • 唯一可以修改 state 的方法。

    • 必须是同步函数,方便调试和时间旅行(devtools 可以追踪)。

    • 比如 INCREMENT(state) { state.count++ }。

  4. Action(异步逻辑 + 提交 mutation)

    • 用来处理异步操作(如请求接口),然后再通过 commit 提交 mutation。

    • 比如登录接口请求成功后,再更新用户信息。

  5. Module(模块化)

    • 项目大了可以把 store 拆分成多个模块,每个模块有自己的 state、mutation、action、getter,互相独立。

使用流程(简单示例)

// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {count: 0},getters: {doubleCount: state => state.count * 2},mutations: {INCREMENT(state) {state.count++}},actions: {asyncIncrement({ commit }) {setTimeout(() => {commit('INCREMENT')}, 1000)}}
})

组件里用:

<template><div><p>{{ count }}</p><p>{{ doubleCount }}</p><button @click="increment">+1</button><button @click="asyncIncrement">异步+1</button></div>
</template><script>
import { mapState, mapGetters, mapActions, mapMutations } from 'vuex'export default {computed: {...mapState(['count']),...mapGetters(['doubleCount'])},methods: {...mapMutations(['INCREMENT']),...mapActions(['asyncIncrement']),increment() {this.INCREMENT()}}
}
</script>

二、Pinia 的核心思想

Pinia 和 Vuex 的思想是一脉相承的:

  • 把组件之间共享的状态抽出来,集中到一个地方(store)管理

  • 保证数据修改可控(不会随便乱改)

  • 让组件用起来像访问普通对象一样方便

但 Pinia 去掉了很多繁琐的东西,让开发体验更轻量。


三、Pinia 的核心概念

  1. Store(存储容器)

    • 相当于一个模块,里面包含 state、getter、action

    • 可以有多个 store,互相独立,天然模块化

  2. State(状态)

    • 就是数据源,写法和 Vue 组件的 data() 类似

    • 支持响应式,组件中直接使用会自动更新

  3. Getter(派生状态)

    • 类似 computed,从 state 派生出新的数据

    • 支持类型推导,比 Vuex 更好用

  4. Action(方法)

    • 相当于 Vue 组件里的 methods,既能处理同步,也能写异步逻辑

    • 可以直接修改 state,不需要 mutation(这是 Pinia 比 Vuex 最大的简化点)


使用示例:定义 store(stores/counter.js)

import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', {state: () => ({count: 0}),getters: {doubleCount: state => state.count * 2},actions: {increment() {this.count++},asyncIncrement() {setTimeout(() => this.count++, 1000)}}
})

在组件中使用:

<script setup>
import { useCounterStore } from '@/stores/counter'const counter = useCounterStore()
</script><template><div><p>{{ counter.count }}</p><p>{{ counter.doubleCount }}</p><button @click="counter.increment">+1</button><button @click="counter.asyncIncrement">异步+1</button></div>
</template>

对比

特点VuexPinia
出现时间2016年,Vue 官方推出2021年,Vue 官方推荐的新库
适用版本Vue2 / Vue3 都支持Vue2(需要插件)/ Vue3 原生支持
核心思想单一状态树(state + mutation + action + getter)多个 store(模块化更自然)
定义方式new Vuex.Store({ ... })defineStore('id', { state, getters, actions })
Mutation必须写 mutation(同步修改 state)不需要 mutation,直接在 action 或 state 里修改
Action用于异步操作,必须 commit mutation 才能改 state既能处理异步,又能直接改 state(更灵活)
Gettergetters: {} 对象形式支持函数式 + 自动推断类型
模块化module 复杂,需要命名空间每个 store 天然独立,无需命名空间
TypeScript 支持类型推导差,写起来繁琐原生支持 TS,类型推导非常好
调试工具Vue DevTools 完善Vue DevTools(新版已全面支持)
学习成本高,概念多(state/getter/mutation/action/module)低,更直观(state/getter/action)
生态未来逐渐被 Pinia 取代官方推荐,Vuex5 也会基于 Pinia
http://www.xdnf.cn/news/18219.html

相关文章:

  • 【Python】Python 面向对象编程详解​
  • Golang database/sql 包深度解析(二):连接池实现原理
  • 【前端面试题】前端面试知识点(第三十一题到第六十一题)
  • 《设计模式》抽象工厂模式
  • 24. 什么是不可变对象,好处是什么
  • 适用监测农作物长势和病虫害的高光谱/多光谱相机有哪些?
  • 【网络通信】TCP/IP 协议全方位解析​
  • 【LeetCode】12. 整数转罗马数字
  • STM32——软硬件I2C
  • 8月17日星期天今日早报简报微语报早读
  • 解锁Java开发神器:XXL-Job从入门到精通
  • java如何使用正则提取字符串中的内容
  • Go语言实战案例-使用ORM框架 GORM 入门
  • Centos 更新/修改宝塔版本
  • GaussDB 数据库架构师修炼(十三)安全管理(5)-全密态数据库
  • 【架构师从入门到进阶】第五章:DNSCDN网关优化思路——第十二节:网关安全-信息过滤
  • 哈希表与unorder_set,unorder_map的学习
  • 【Linux系列】常见查看服务器 IP 的方法
  • 深入了解 Filesystem Hierarchy Standard (FHS) 3.0 规范
  • 17.5 展示购物车缩略信息
  • 【Linux】文件基础IO
  • Google Earth Engine | (GEE)逐月下载的MODIS叶面积指数LAI
  • Rust 入门 生命周期(十八)
  • 【牛客刷题】字符串按索引二进制1个数奇偶性转换大小写
  • C#高级语法_委托
  • java基础(十)sql的mvcc
  • 字节 Golang 大模型应用开发框架 Eino简介
  • 进程互斥的硬件实现方法
  • 私人AI搜索新突破:3步本地部署Dify+Ollama+QwQ,搜索能力MAX
  • 《动手学深度学习v2》学习笔记 | 1. 引言