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

Vue3 Pinia Store使用示例

代码示例:

import { defineStore } from "pinia";  // 导入 Pinia 的 defineStore 方法
import { ref } from "vue";           // 导入 Vue 的响应式 API ref
import { type Menu } from "@/interface"; // 导入自定义的 Menu 类型

// 创建一个名为 'userMenu' 的 Store
const useUserMenuStore = defineStore(
  "userMenu",  // Store 的唯一标识名
  () => {      // 使用组合式 API 的 setup 函数写法
    // 1. 定义当前菜单状态(响应式引用)
    const menu = ref<Menu[]>([]);  // 创建一个存储 Menu 数组的响应式引用

    // 2. 设置菜单的方法
    const setMenu = (newMenu: Menu[]) => {
      menu.value = newMenu;  // 更新菜单数据
    };

    // 3. 清除菜单的方法
    const removeMenu = () => {
      menu.value = [];       // 清空当前菜单
      pastMenu.value = [];   // 同时清空历史菜单
    };

    // 4. 定义历史菜单状态(响应式引用)
    const pastMenu = ref<Menu[]>([]);  // 创建一个存储历史菜单的响应式引用

    // 5. 设置历史菜单的方法
    const setPastMenu = (newMenu: Menu[]) => {
      pastMenu.value = newMenu;  // 更新历史菜单数据
    };

    // 暴露所有需要外部访问的状态和方法
    return { menu, setMenu, removeMenu, pastMenu, setPastMenu };
  },
  { persist: true }  // 启用持久化插件配置(页面刷新后数据不丢失)
);

export default useUserMenuStore;  // 导出 Store

核心概念解释:

  1. defineStore

    • Pinia 的核心方法,用于创建 Store

    • 第一个参数是 Store 的唯一名称

    • 第二个参数是 setup 函数,用组合式 API 编写

    • 第三个参数是配置对象,这里启用了持久化

  2. ref

    • Vue 的响应式 API,用于创建响应式数据

    • ref<Menu[]> 表示这是一个存储 Menu 类型数组的响应式引用

    • 通过 .value 访问/修改值(但在模板中会自动解包,不需要 .value)

  3. 类型系统

    • Menu 是自定义类型(来自 @/interface)

    • TypeScript 泛型 <Menu[]> 确保数据类型的正确性

  4. 方法功能

    • setMenu:更新当前菜单

    • removeMenu:清空所有菜单数据

    • setPastMenu:更新历史菜单

  5. 持久化配置

    • { persist: true } 表示启用状态持久化

    • 需要配合 pinia-plugin-persistedstate 插件使用

    • 数据会保存在 localStorage 中,防止页面刷新丢失

使用场景示例:

javascript

// 在组件中使用
import useUserMenuStore from '@/stores/userMenu';

const menuStore = useUserMenuStore();

// 更新菜单
menuStore.setMenu([{ id: 1, name: '首页' }]);

// 获取当前菜单
console.log(menuStore.menu); 

// 清空菜单
menuStore.removeMenu();

新手需要注意:

  1. 响应式规则

    • 在 JS 中修改状态需要使用 .value

    • 在模板中直接使用变量名即可

  2. Store 的生命周期

    • 单例模式:整个应用共享同一个 Store 实例

    • 持久化数据会一直保留,直到手动清除或用户清除浏览器缓存

  3. 类型安全

    • TypeScript 的类型约束可以帮助减少错误

    • 如果传递错误类型的参数,编译时会报错

这个 Store 的设计非常适合管理需要持久化的全局界面状态(比如用户菜单、主题设置等),通过分离状态逻辑使组件更专注于视图渲染。

http://www.dtcms.com/a/109830.html

相关文章:

  • Linux 系统管理综合实训 —— 基于 NAT 模式的多 IP 配置、Nginx 服务部署及存储管理
  • 一周学会Pandas2 Python数据处理与分析-安装Pandas库
  • 在Vue3中格式化后端返回的Java Date类型数据为指定格式
  • 蓝桥杯真题———k倍区间
  • Android开发okhttp添加头部参数
  • 智能建造新范式:装配式建筑 4.0 的数字化进阶
  • SpringBoot集成Redis 灵活使用 TypedTuple 和 DefaultTypedTuple 实现 Redis ZSet 的复杂操作
  • Vue3 性能优化指南:从理论到实战
  • N皇后问题(dfs回溯)
  • 如何把网页文章转为pdf保存
  • 计算机网络基础:容灾备份与业务连续性保障
  • 在 Ubuntu 上离线安装 Prometheus 和 Grafana
  • GMS测试环境搭建二——aapt2报错
  • Kafka配置内外网访问(解决kafka外网访问broker超时)
  • Pytorch中预置数据集的加载方式
  • 斜方肌科学训练原则:上斜方肌多牵拉放松,中下斜方肌多锻炼强健。 | 告别圆肩驼背、“富贵包”
  • 第十四届蓝桥杯大赛软件赛省赛Python 研究生组:4.互质数的个数
  • Python星球日记 - 第2天:数据类型与变量
  • Android U 分屏——分割线相关
  • 基于ANSYS 概率设计和APDL编程的结构可靠性设计分析
  • mqtt封装与使用
  • 大模型面试题
  • SSL/TLS
  • 【系统架构设计师】系统架构评估中的重要概念
  • 几何法证明卡特兰数_栈混洗
  • 代码随想录|动态规划|21组合总和IV
  • 从零开始:使用Spring Boot和MyBatis实现CRUD操作全攻略
  • 25.Reactor
  • PHP代码审计-01
  • RAGFlow 知识库分段研究