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

按功能拆分 Pinia 仓库

1、示例仓库结构:(以下示例来自AI,存档是为了后期看到此分割结构)

src/ ├── stores/ # 所有 Pinia 仓库的根目录 │ ├── index.js # 仓库的统一导出入口(可选,但推荐) │ ├── user.js # 用户相关仓库(登录、个人信息等) │ ├── cart.js # 购物车相关仓库(商品增删、数量等) │ ├── goods.js # 商品相关仓库(列表、详情、筛选等) │ └── settings.js # 系统设置仓库(主题、语言等) └── main.js # 项目入口

2、编写单个功能的仓库文件

①用户仓库:src/stores/user.js

import { defineStore } from 'pinia' // 定义并导出用户仓库,命名规则:use + 功能名 + Store export const useUserStore = defineStore('user', { // 状态:存储用户相关数据 state: () => ({ userId: '', username: '', token: '', avatar: '', isLogin: false }), // 计算属性:基于state派生的状态 getters: { // 示例:获取用户信息摘要 userInfoSummary: (state) => { return state.isLogin ? `${state.username} (${state.userId})` : '未登录' } }, // 方法:修改状态的逻辑(同步/异步都支持) actions: { // 登录操作 login(userData) { this.userId = userData.userId this.username = userData.username this.token = userData.token this.avatar = userData.avatar this.isLogin = true // 可结合异步请求:如 await api.login(xxx) }, // 退出登录 logout() { // 重置state(Pinia内置方法,快速清空当前仓库状态) this.$reset() } } })

②购物车仓库:src/stores/cart.js

import { defineStore } from 'pinia' export const useCartStore = defineStore('cart', { state: () => ({ // 购物车商品列表:[{ id, name, price, count }] goodsList: [], totalPrice: 0 }), getters: { // 计算购物车商品总数 goodsCount: (state) => { return state.goodsList.reduce((sum, item) => sum + item.count, 0) } }, actions: { // 添加商品到购物车 addGoods(goods) { const existing = this.goodsList.find(item => item.id === goods.id) if (existing) { existing.count += 1 } else { this.goodsList.push({ ...goods, count: 1 }) } // 重新计算总价 this.calcTotalPrice() }, // 计算总价(内部辅助方法) calcTotalPrice() { this.totalPrice = this.goodsList.reduce( (sum, item) => sum + item.price * item.count, 0 ) }, // 清空购物车 clearCart() { this.goodsList = [] this.totalPrice = 0 } } })

3、统一导出入口(可选但推荐)

创建src/stores/index.js,把所有仓库统一导出,方便组件中批量引入:

// 统一导出所有仓库,简化组件引入 export * from './user' export * from './cart' export * from './goods' export * from './settings'

4、Pinia 在 main.js 中的注册步骤

// src/main.js import { createApp } from 'vue' import { createPinia } from 'pinia' // 导入 Pinia 创建方法 import App from './App.vue' // 1. 创建 Vue 应用实例 const app = createApp(App) // 2. 创建 Pinia 实例 const pinia = createPinia() // 3. 将 Pinia 挂载到 Vue 应用上(核心步骤) app.use(pinia) // 4. 挂载应用到 DOM app.mount('#app')

5、在组件中使用拆分后的仓库

<template> <div> <div>用户状态:{{ userStore.userInfoSummary }}</div> <div>购物车商品数:{{ cartStore.goodsCount }}</div> <button @click="handleLogin">模拟登录</button> <button @click="handleAddGoods">添加商品到购物车</button> </div> </template> <script setup> // 方式1:从统一入口引入(推荐) import { useUserStore, useCartStore } from '@/stores' // 方式2:直接从单个仓库文件引入 // import { useUserStore } from '@/stores/user' // import { useCartStore } from '@/stores/cart' // 获取仓库实例(Pinia会自动缓存,多次调用返回同一个实例) const userStore = useUserStore() const cartStore = useCartStore() // 模拟登录 const handleLogin = () => { userStore.login({ userId: '1001', username: '张三', token: 'xxx-xxx-xxx', avatar: '/avatar.png' }) } // 模拟添加商品 const handleAddGoods = () => { cartStore.addGoods({ id: 'goods001', name: 'Vue实战教程', price: 99 }) } </script>

6、跨仓库调用。如果一个仓库需要依赖另一个仓库的数据 / 方法(比如购物车需要用户登录状态),可在actions中直接引入并使用:

// 在 cart.js 中依赖 user.js 的状态 import { useUserStore } from './user' export const useCartStore = defineStore('cart', { actions: { addGoods(goods) { const userStore = useUserStore() // 未登录则提示,不允许添加 if (!userStore.isLogin) { alert('请先登录!') return } // 已登录则执行添加逻辑 // ... 省略原有添加代码 } } })
http://www.jsqmd.com/news/412366/

相关文章:

  • 自己搭建知识库:9种RAG架构全解析(非常详细),从入门到精通,收藏这一篇就够了!
  • 企业级RAG多模态进阶指南:2026技术全景(非常详细),从文本对齐到端到端融合,从入门到精通!
  • 260202
  • RAG不用向量数据库居然更准?深度解析技术新思路(非常详细),从入门到精通,这一篇讲透了!
  • Gamma-Gamma信道的蒙特卡洛仿真
  • [agent] Stanford CS230: Deep Learning I Autumn 2025
  • 【Linux系统编程】(四十)线程控制终极指南:从资源共享到实战操控,带你吃透线程全生命周期
  • 2026成都装修公司口碑十强榜|避坑指南!按区域+需求精准匹配,附实测数据 - 品牌测评鉴赏家
  • Windows+Kali Linux双系统下的Vulhub漏洞复现环境搭建全攻略
  • 2026高端装修全案哪家强?成都口碑之选+避坑指南,别墅/大平层业主必藏 - 品牌测评鉴赏家
  • git文件大小写变更无法提交问题
  • 装修全案设计大揭秘:省心靠谱之选攻略 - 品牌测评鉴赏家
  • 文档外发风险治理:国内主流技术解决方案全景解析
  • 2026年GEO优化服务商Top5深度测评:从技术到效果的选型指南 - 小白条111
  • 2026全案装修避坑指南 4家实力派装企推荐,预算/设计/售后全覆盖 - 品牌测评鉴赏家
  • 成都装修公司哪家强?3家口碑王炸款,省心避坑不踩雷! - 品牌测评鉴赏家
  • 装修不踩坑!优质全案装修公司详解 - 品牌测评鉴赏家
  • 2026年GEO优化公司推荐Top7:从技术实力到效果落地的深度测评 - 小白条111
  • 一招教你正确打开星绘友晴天steam版
  • 2026年AI搜索优化公司推荐Top6:从技术实力到效果落地的专业测评与选型指南 - 小白条111
  • IP2070L_02S至为芯支持AC口快充的24W功率AC/DC芯
  • 2026年GEO优化服务商Top9深度测评:从技术实力到效果落地的选型指南 - 小白条111
  • 新房全案装修选哪家?2026口碑榜+避坑指南,亲测不踩雷 - 品牌测评鉴赏家
  • 云电脑测试版
  • 2026全案装修大揭秘:这些优质公司值得关注 - 品牌测评鉴赏家
  • 2026年GEO优化公司Top4深度测评:从技术实力到效果落地的选型指南 - 小白条111
  • 2026年GEO优化服务商Top4深度测评:从技术自研到效果落地的选型指南 - 小白条111
  • 2026年GEO优化服务商深度测评Top3:从技术实力到效果落地的专业选型指南 - 小白条111
  • 2026年GEO优化服务商Top7深度测评:从技术实力到效果落地的选型指南 - 小白条111
  • 2026年GEO公司TOP7深度测评:从技术实力到效果落地的选型指南 - 小白条111