← 返回文章列表
Vue·544 次阅读

Pinia:更符合直觉的 Vuex 继任者

Pinia:更符合直觉的 Vuex 继任者

Pinia 最初是为 Vue 3 设计的状态管理探索,现在已是官方推荐方案。在新项目里用了一圈,确实比 Vuex 清爽。

定义 store

// stores/posts.js
import { defineStore } from 'pinia'

export const usePostsStore = defineStore('posts', {
  state: () => ({ list: [], loading: false }),
  getters: {
    count: (state) => state.list.length,
  },
  actions: {
    async fetchAll() { // 没有 mutations 了,直接在 action 里改
      this.loading = true
      this.list = await fetch('/api/posts').then(r => r.json())
      this.loading = false
    },
  },
})

组件中使用

const store = usePostsStore()
store.list // 直接读
store.fetchAll() // 直接调 action
store.$patch({ loading: true }) // 批量修改
store.$reset() // 重置为初始 state

相比 Vuex 的改进

  • 取消 mutations:state 直接改,少一层概念,devtools 照样能追踪
  • 天然模块化:每个 store 独立定义、自动按需引入,没有嵌套 modules 和命名空间烦恼
  • TypeScript 完整推断:state/getters/actions 全部自动推导,不用手写类型声明
  • 支持组合式写法:store 里直接 ref/computed/function,和组件写法完全一致
  • 更轻(约 1KB),支持 SSR 和 Nuxt 官方集成

组合式风格的 store

export const useCounter = defineStore('counter', () => {
  const count = ref(0)
  const double = computed(() => count.value * 2)
  function increment() { count.value++ }
  return { count, double, increment }
})

与组件逻辑复用同一套心智模型,从组件抽到 store 几乎零成本。Vuex 项目不必急着迁,但新项目没有理由再选 Vuex。

看到这里了?如果这篇文章帮到过你

请我喝瓶可乐就好 🥤

收款码

评论0 条

还没有评论,来抢沙发~

发表评论

评论需审核后显示

© 2026 许冬博客 · 专注 JS 技术分享

·RSS 订阅·Powered by Nuxt 4