当项目发展到多组件共享状态时,单纯依靠父子组件通信会变得难以维护。Pinia 作为 Vue 3 官方推荐的状态管理工具,提供更清晰的逻辑分层和响应式状态管理。今天我们将学习如何用 Pinia 实现全局状态管理,并构建可维护的任务管理模块。
Vue3 官方中文文档传送点: 简介 | Vue.js
Vue3 的中文官方文档学习笔记很全还有练习场,推荐去官网学习
Vue前端成仙之路:Vue 前端成仙之路_野生的程序媛的博客-CSDN博客
GO后端成神之路:Go 后端成神之路_野生的程序媛的博客-CSDN博客
当遇到以下场景时,需引入状态管理:
概念 | 作用 | 示例场景 |
---|---|---|
State | 存储全局响应式数据 | tasks: [] 任务列表 |
Getters | 基于 State 的派生数据(计算属性) | completedTasksCount |
Actions | 修改 State 的业务逻辑 | addTask() , deleteTask() |
bash
npm install pinia
javascript
// main.js
import { createPinia } from 'pinia'
const app = createApp(App)
app.use(createPinia())
app.mount('#app')
javascript
// stores/taskStore.js
import { defineStore } from 'pinia'
export const useTaskStore = defineStore('task', {
state: () => ({
tasks: [],
filter: 'all' // all/completed/active
}),
getters: {
filteredTasks() {
return this.tasks.filter(task => {
if (this.filter === 'completed') return task.completed
if (this.filter === 'active') return !task.completed
return true
})
}
},
actions: {
addTask(title) {
this.tasks.push({
id: Date.now(),
title,
completed: false
})
},
toggleTask(id) {
const task = this.tasks.find(t => t.id === id)
if (task) task.completed = !task.completed
}
}
})
bash
src/
stores/
taskStore.js # 任务管理模块
userStore.js # 用户模块
configStore.js # 系统配置模块
javascript
// stores/userStore.js
export const useUserStore = defineStore('user', {
actions: {
logout() {
const taskStore = useTaskStore()
taskStore.$reset() // 退出时清空任务状态
}
}
})
vue
{{ task.title }}
javascript
// ❌ 错误:破坏响应性
const { tasks } = storeToRefs(taskStore)
// ✅ 正确方式
import { storeToRefs } from 'pinia'
const { tasks } = storeToRefs(taskStore)
bash
npm install pinia-plugin-persistedstate
javascript
// main.js
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)
javascript
// 在 Store 中启用
export const useTaskStore = defineStore('task', {
persist: true, // 开启持久化
state: () => ({ /* ... */ })
})
javascript
// 重置单个 Store
taskStore.$reset()
// 订阅状态变化
taskStore.$subscribe((mutation, state) => {
console.log('状态变化:', mutation.type, state)
})
特性 | Pinia | Vuex |
---|---|---|
Vue 3 支持 | 原生支持 | 需要兼容版本 |
TypeScript | 完美支持 | 需要额外配置 |
代码结构 | 更简洁的 Composition API | 基于 Options API |
模块化 | 天然多 Store 设计 | 需要分 modules |
创建taskStore
实现以下功能:
在组件中集成:
vue
{{ task.title }}