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

Vue 3 中,Pinia 和 Vuex 的主要区别

总结对比表

对比项VuexPinia
API 设计区分 mutations/actionsstate/actions/getters
模块化嵌套式配置独立 Store,按需组合
TypeScript需手动声明类型原生自动推断
代码简洁性冗余(需 commit/dispatch直接调用方法
推荐场景Vue 2 升级项目/严格规范Vue 3 新项目/灵活简洁

Vue 3 中 Pinia 和 Vuex 的核心区别及代码对比

1. 核心 API 对比

Vuex 示例
// store.js
import { createStore } from 'vuex';

export default createStore({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++; // 必须通过 mutations 同步修改
    }
  },
  actions: {
    incrementAsync({ commit }) {
      setTimeout(() => {
        commit('increment'); // 异步操作需调用 commit
      }, 1000);
    }
  },
  getters: {
    doubleCount: (state) => state.count * 2
  }
});
Pinia 示例
// counterStore.js
import { defineStore } from 'pinia';

export const useCounterStore = defineStore('counter', {
  state: () => ({ count: 0 }),
  actions: {
    increment() {
      this.count++; // 直接通过 this 修改状态
    },
    async incrementAsync() {
      setTimeout(() => {
        this.increment(); // 支持异步操作
      }, 1000);
    }
  },
  getters: {
    doubleCount: (state) => state.count * 2
  }
});

关键差异

  • Pinia 移除 mutations,允许在 actions 中直接修改状态(同步/异步均可)。
  • Vuex 强制区分 mutations(同步)和 actions(异步)。

2. 模块化对比

Vuex 模块化(嵌套式)
// userModule.js
export default {
  state: { name: 'User' },
  mutations: { ... }
};

// store.js
import userModule from './userModule';

export default createStore({
  modules: {
    user: userModule // 嵌套式模块
  }
});
Pinia 模块化(扁平化)
// userStore.js
export const useUserStore = defineStore('user', {
  state: () => ({ name: 'User' })
});

// productStore.js
export const useProductStore = defineStore('product', { ... });

关键差异

  • Vuex 需在单一 Store 中嵌套模块;Pinia 支持独立定义 Store,按需引入。

3. 组件中使用对比

Vuex 组件调用
<template>
  <div>{{ $store.state.count }}</div>
  <button @click="$store.commit('increment')">同步 +1</button>
  <button @click="$store.dispatch('incrementAsync')">异步 +1</button>
</template>
Pinia 组件调用
<template>
  <div>{{ counterStore.count }}</div>
  <button @click="counterStore.increment()">同步 +1</button>
  <button @click="counterStore.incrementAsync()">异步 +1</button>
</template>

<script setup>
import { useCounterStore } from './counterStore';
const counterStore = useCounterStore();
</script>

关键差异

  • Pinia 通过 Store 实例直接调用方法,代码更简洁;Vuex 需通过 commit/dispatch

4. TypeScript 支持对比

Vuex 类型声明(手动)
// 需手动定义类型
interface State {
  count: number;
}

const store = createStore<State>({
  state: { count: 0 },
  mutations: {
    increment(state) {
      state.count++; // 需手动确保类型匹配
    }
  }
});
Pinia 类型推断(自动)
// 自动推断类型
const counterStore = useCounterStore();
counterStore.increment(); // 方法名和参数自动提示
counterStore.count++;     // 直接修改状态(需配置允许)

关键差异

  • Pinia 原生支持 TypeScript 类型推断;Vuex 需手动配置类型。

5. 响应式解构对比

Pinia 的响应式解构
import { storeToRefs } from 'pinia';

const counterStore = useCounterStore();
const { count, doubleCount } = storeToRefs(counterStore); // 解构后仍保持响应式

Vuex 的局限性

  • Vuex 解构 $store.state.count 会失去响应性,需通过 computed 包装。

总结对比表

对比项VuexPinia
API 设计区分 mutations/actionsstate/actions/getters
模块化嵌套式配置独立 Store,按需组合
TypeScript需手动声明类型原生自动推断
代码简洁性冗余(需 commit/dispatch直接调用方法
推荐场景Vue 2 升级项目/严格规范Vue 3 新项目/灵活简洁

相关文章:

  • blender骨骼分层问题:某一层的骨骼怎么移动到第一层
  • SQL高级语法
  • 【六】Golang 运算符
  • Git备忘录(三)
  • 【Spring Cloud Alibaba】Sentinel 服务熔断与流量控制
  • 【股票数据API接口24】如何获取最近10天资金流入趋势数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • huggingface+下载deepseek8b lamda+本地部署 笔记
  • python中使用日期和时间差:datetime模块
  • 2011年下半年软件设计师考试上午题真题的详细知识点分类整理(附真题及答案解析)
  • Python 植物大战僵尸
  • 地面沉降监测,为地质安全保驾护航
  • 使用SHOW PROCESSLIST和SHOW ENGINE INNODB STATUS排查mysql锁等待问题
  • mysql 存储空间增大解决方案
  • 什么是KL散度:概率分布的差异(筛子1/6情况下KL为:0)
  • mysql快照读当前读
  • 考研操作系统---磁盘
  • 【Zookeeper如何实现分布式锁?】
  • 【怎么使用Redis实现一个延时队列?】
  • nnUNet V2修改网络——加入GAB模块
  • 使用docker部署NextChat,使用阿里云、硅机流动、deepseek的apikey
  • 2025全球城市科技传播能力指数出炉,上海位列第六
  • 哪条线路客流最大?哪个站点早高峰人最多?上海地铁一季度客流报告出炉
  • 张家界一铁路致17人身亡,又有15岁女孩殒命,已开始加装护栏
  • 悬疑剧背后的女编剧:创作的差异不在性别,而在经验
  • 全国省市县国土空间总体规划已基本批复完成,进入全面实施阶段
  • 商务部:今年前3月自贸试验区进出口总额达2万亿元