重生之我在学Vue--第6天 Vue 3 状态管理(Pinia)

devtools/2025/3/13 21:08:17/

重生之我在学Vue–第6天 Vue 3 状态管理(Pinia)

文章目录

  • 重生之我在学Vue--第6天 Vue 3 状态管理(Pinia)
    • 前言
    • 一、Pinia 核心概念速览
      • 1.1 为什么需要状态管理?
      • 1.2 Pinia 核心三要素
    • 二、Pinia 快速上手
      • 2.1 安装与初始化
      • 2.2 创建第一个 Store
    • 三、模块化状态管理
      • 3.1 多 Store 场景
      • 3.2 Store 间通信
    • 四、在组件中使用 Pinia
      • 4.1 状态访问与修改
      • 4.2 状态解构的陷阱
    • 五、进阶开发技巧
      • 5.1 持久化存储插件
      • 5.2 状态重置与订阅
    • 六、常见问题解答
      • Q1:Pinia 和 Vuex 有什么区别?
      • Q2:如何调试 Pinia 状态?
    • 今日任务:构建任务管理模块

前言

当项目发展到多组件共享状态时,单纯依靠父子组件通信会变得难以维护。Pinia 作为 Vue 3 官方推荐的状态管理工具,提供更清晰的逻辑分层和响应式状态管理。今天我们将学习如何用 Pinia 实现全局状态管理,并构建可维护的任务管理模块。

Vue3 官方中文文档传送点: 简介 | Vue.js

Vue3 的中文官方文档学习笔记很全还有练习场,推荐去官网学习

Vue前端成仙之路:Vue 前端成仙之路_野生的程序媛的博客-CSDN博客

GO后端成神之路:Go 后端成神之路_野生的程序媛的博客-CSDN博客


一、Pinia 核心概念速览

1.1 为什么需要状态管理?

当遇到以下场景时,需引入状态管理:

  • 多个组件依赖同一状态(如用户登录信息)
  • 跨层级组件需要修改同一状态
  • 需要跟踪复杂的状态变更历史

1.2 Pinia 核心三要素

概念作用示例场景
State存储全局响应式数据tasks: [] 任务列表
Getters基于 State 的派生数据(计算属性)completedTasksCount
Actions修改 State 的业务逻辑addTask(), deleteTask()

二、Pinia 快速上手

2.1 安装与初始化

bash

npm install pinia

javascript

javascript">// main.js
import { createPinia } from 'pinia'const app = createApp(App)
app.use(createPinia())
app.mount('#app')

2.2 创建第一个 Store

javascript

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.completedif (this.filter === 'active') return !task.completedreturn 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}}
})

三、模块化状态管理

3.1 多 Store 场景

bash

src/stores/taskStore.js    # 任务管理模块userStore.js    # 用户模块configStore.js  # 系统配置模块

3.2 Store 间通信

javascript

javascript">// stores/userStore.js
export const useUserStore = defineStore('user', {actions: {logout() {const taskStore = useTaskStore()taskStore.$reset() // 退出时清空任务状态}}
})

四、在组件中使用 Pinia

4.1 状态访问与修改

vue

<script setup>
import { useTaskStore } from '@/stores/taskStore'const taskStore = useTaskStore()// 直接访问状态
console.log(taskStore.tasks) // 调用 Action
const handleAdd = () => taskStore.addTask(newTask.value)
</script><template><div v-for="task in taskStore.filteredTasks" :key="task.id">{{ task.title }}<button @click="taskStore.toggleTask(task.id)">切换状态</button></div>
</template>

4.2 状态解构的陷阱

javascript

javascript">// ❌ 错误:破坏响应性
const { tasks } = storeToRefs(taskStore) // ✅ 正确方式
import { storeToRefs } from 'pinia'
const { tasks } = storeToRefs(taskStore)

五、进阶开发技巧

5.1 持久化存储插件

bash

npm install pinia-plugin-persistedstate

javascript

javascript">// main.js
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)

javascript

javascript">// 在 Store 中启用
export const useTaskStore = defineStore('task', {persist: true, // 开启持久化state: () => ({ /* ... */ })
})

5.2 状态重置与订阅

javascript

javascript">// 重置单个 Store
taskStore.$reset()// 订阅状态变化
taskStore.$subscribe((mutation, state) => {console.log('状态变化:', mutation.type, state)
})

六、常见问题解答

Q1:Pinia 和 Vuex 有什么区别?

特性PiniaVuex
Vue 3 支持原生支持需要兼容版本
TypeScript完美支持需要额外配置
代码结构更简洁的 Composition API基于 Options API
模块化天然多 Store 设计需要分 modules

Q2:如何调试 Pinia 状态?

  1. 安装 Vue Devtools
  2. 在浏览器开发者工具中查看 Pinia 标签页
  3. 实时查看状态变化和时间旅行调试

今日任务:构建任务管理模块

  1. 创建taskStore实现以下功能:

    • 任务增删改查
    • 按状态过滤任务
    • s任务统计(总数/完成数)
  2. 在组件中集成:

    vue

    <template><div><input v-model="newTask" @keyup.enter="addTask"><select v-model="taskStore.filter"><option value="all">全部</option><option value="completed">已完成</option><option value="active">未完成</option></select><div v-for="task in taskStore.filteredTasks" :key="task.id">{{ task.title }}<button @click="taskStore.toggleTask(task.id)">{{ task.completed ? '✅' : '⬜' }}</button></div></div>
    </template>
    

http://www.ppmy.cn/devtools/166852.html

相关文章

[动手学习深度学习]13.丢弃法 Dropout

权重衰退是常见处理过拟合的方法 丢弃法比权重衰退效果要好 动机 一个好的模型 需要第输入数据的扰动具有鲁棒性 使用有噪音的数据等价于Tikhonov正则丢弃法&#xff1a;在层之间加入噪音 &#xff08;所以丢弃法其实是一个正则&#xff09; 无偏差的加入噪音 对x加入噪音…

重新认识OpenCV:C++视角下的历史演进、功能特性以及OpenCV 4.11新特性

&#xff08;基于2025年最新技术动态&#xff0c;面向工业级C开发者&#xff09; 一、OpenCV的历史迭代与技术定位 自1999年英特尔实验室诞生以来&#xff08;记住这个人-加里 布拉德斯基&#xff0c;是他怀揣着美好愿景启动了这个项目&#xff09;&#xff0c;OpenCV已成长…

leetcode日记(92)从前序与中序遍历序列构造二叉树

想了很久很久&#xff0c;其实思路很简单&#xff0c;应该是在数据结构上讲过的方法。 意思是前序遍历中&#xff0c;正中间一定是第一位&#xff0c;而中序遍历&#xff0c;正中间在中间位置&#xff0c;将左右节点分开。 有了这个思路就好做了。 每次取前序遍历的下一位&a…

Pygame实现射击鸭子游戏3-1

基于pygame的打鸭子游戏如图1所示。 图1 打鸭子游戏 从图1中可以看出&#xff0c;玩家通过鼠标控制瞄准镜的移动&#xff0c;点击鼠标左键射击鸭子。而鸭子则从屏幕左边向右边游动&#xff0c;当游到屏幕右侧边界后&#xff0c;重新回到屏幕左侧继续游动。 游戏需要创建两个类…

【每日学点HarmonyOS Next知识】类型判断、刘海高度、隐私弹窗、滑动下一页效果、清楚缓存

1、HarmonyOS instanceof判断错误&#xff1f; ArkTS部分支持instanceof&#xff0c;可参考文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/typescript-to-arkts-migration-guide-V5 instanceof运算符在传递的过程中可能会发生以下情况&…

CTFHub-上传文件

打开网址 新建一个文档&#xff0c;在其中写下面的内容&#xff0c;将名字该为1.php <?php eval($_POST[cmd]);?> 将1.php提交上去&#xff0c;发现没反应 按f12查看后发现没有提交的代码&#xff0c;右键编辑&#xff0c;自己写一个 <input type"submit"…

Python的顺序结构和循环结构

文章目录 一、条件语句&#xff08;1&#xff09;条件语句的定义&#xff08;2&#xff09;条件语句的语法&#xff08;a&#xff09;单分支 if&#xff08;b&#xff09;双分支 if-else&#xff08;c&#xff09;多分支 if-elif-elif-...-else &#xff08;3&#xff09;注意事…

蓝桥杯——又是二分

题目 答案 #include <bits/stdc.h>using namespace std;const int N 50010; int L,n,M; int a[N];bool check(int x) {int i 0,now 0;int cnt 0;//搬走石头的数目while(i<n1){i;if(a[i]-a[now]>x) nowi;else {cnt;}}if(cnt < M) return true;else return …