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

embedded/2025/3/13 22:24:10/

重生之我在学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/embedded/172361.html

相关文章

基于Java的自助多张图片合成拼接实战

目录 前言 一、图片合成需求描述 二、图片合成设计与实现 1、编程语言 2、基础数据准备 3、图片合成流程 4、图片合成实现 三、总结 前言 在当今数字化时代&#xff0c;图像处理技术在各个领域都发挥着至关重要的作用。从社交媒体到电子商务&#xff0c;从在线教育到虚拟…

接口测试和功能测试的区别

接口测试和功能测试的区别 一 **接口测试概述**1.1 定义1.2 优缺点 二 **功能测试概述**2.1 定义2.2 优缺点 三 **主要区别**四 两者在测试点的区别4.1 **接口测试的测试点**4.2 **功能测试的测试点**4.3 **接口测试 vs. 功能测试的测试点对比** 五 区别类比**例子背景**&#…

【Pytorch Transformers Fine-tune】使用BERT进行情感分类任务微调

在这篇教程中&#xff0c;将带你了解如何对预训练模型进行微调&#xff0c;这是一种强大的技术&#xff0c;可以让你将最先进的模型应用到你的特定任务上。微调相比从头训练模型有显著优势&#xff1a;它减少了计算成本&#xff0c;降低了碳足迹&#xff0c;并允许你无需从零开…

交易所开发:数字市场的核心动力

在数字化浪潮席卷全球的今天&#xff0c;数字市场以其独特的魅力和无限的潜力&#xff0c;成为了推动全球经济转型和升级的重要力量。而在这场变革中&#xff0c;交易所开发作为数字市场的核心动力&#xff0c;正以前所未有的速度和规模重塑着金融交易、商品流通和价值交换的方…

MySQL的 where 1=1会不会影响性能?

在MySQL中&#xff0c;WHERE 11 是一种常见的SQL编写技巧&#xff0c;通常用于动态生成SQL语句时简化条件拼接。虽然它看起来多余&#xff0c;但在实际使用中&#xff0c;WHERE 11 对性能的影响可以忽略不计。以下是详细分析&#xff1a; 1. WHERE 11 的作用 WHERE 11 是一个恒…

K8S日常问题优化

在实际工作中&#xff0c;优化 Kubernetes 的性能和成本通常需要结合资源利用率分析、集群配置调整以及自动化工具的整合。以下是我在项目中实践过的一些典型优化场景和解决方案&#xff1a; 一、资源利用率优化 1. 合理配置 Requests/Limits 问题&#xff1a;许多团队未准确设…

施磊老师c++笔记(四)

运算符承载,是编程更灵活 文章目录 运算符承载,是编程更灵活1.复数类comlex2.string类3.迭代器iterator4.vector容器 迭代器实现5.容器的迭代器失效问题6.深入理解new和delete原理7.new和delete重载实现对象池应用 1.复数类comlex 定义复数类, 实现的重载函数 # 复数类 */ cl…

Python刷题:Python基础

今天刷的是PythonTip的Python 入门挑战中的题&#xff0c;整体难度不高&#xff0c;适合小白练手以及巩固知识点。下面会进行详细讲解。 每日一句 梦想不会发光&#xff0c;发光的是追逐梦想的我们。 只要你真的愿意为自己的梦想去努力&#xff0c; 最差的结果&#xff0c;…