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

Pinia 核心概念详解:Store, State, Getter, Action

一、核心概念定义与示例代码

1.Store (存储仓库)

Pinia 的核心容器,用于管理全局状态和业务逻辑:

// stores/counter.js
import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', {state: () => ({ count: 0 }), // Stategetters: { doubled: (state) => state.count * 2 }, // Getteractions: { increment() { this.count++ } } // Action
})

2.State (状态)

存储应用数据的响应式对象:

state: () => ({count: 0,user: { name: 'Alice', age: 30 }
})
  • 特点:类似 Vue 组件的 data

  • 修改方式

// 直接修改
const store = useCounterStore()
store.count = 5// 批量修改 ($patch)
store.$patch({ count: 10, user: { ...store.user, age: 31 } })

3.Getter (计算属性)

基于 State 派生的计算值(带缓存):

getters: {// 基础用法upperCaseName: (state) => state.user.name.toUpperCase(),// 访问其他 gettergreeting: (state) => {return `Hello, ${this.upperCaseName}!` }
}
  • 特性

    • 自动推导类型(TS)

    • 通过 this 访问整个 store 实例

4.Action (操作方法)

处理同步/异步业务逻辑:

actions: {async fetchUser(userId) {try {const res = await api.getUser(userId)// 修改 statethis.user = res.data } catch (error) {console.error('Fetch failed:', error)}}
}
  • 特性

    • 支持异步操作

    • 通过 this 直接访问 state/getters

    • 可组合多个 action

二、核心概念关系图解

三、完整示例代码

<!-- Component.vue -->
<script setup>
import { useCounterStore } from '@/stores/counter'const store = useCounterStore()
</script><template><div><!-- State 使用 --><p>Count: {{ store.count }}</p><!-- Getter 使用 --><p>Doubled: {{ store.doubled }}</p><!-- Action 调用 --><button @click="store.increment()">+1</button><button @click="store.fetchUser(123)">Load User</button></div>
</template>

四、核心特性对比表

概念类型是否可异步典型用途响应式缓存
State数据对象存储原始数据
Getter计算属性派生状态/复杂计算
Action函数方法业务逻辑/API 交互
Store容器实例-整合 state/getter/action--

五、总结

  1. Store 是状态管理的核心容器,通过唯一的 ID 注册

  2. State 是响应式数据源,推荐使用 $patch 进行批量更新

  3. Getter 提供高效的计算属性,自动缓存结果避免重复计算

  4. Action 封装业务逻辑代替 Vuex 的 mutations+actions

  5. 设计优势

    • 完整的 TS 类型推断

    • 模块化设计(支持多个 store)

    • 组件内直接修改 state 的简易性

    • 取消 mutations 简化操作流程

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

相关文章:

  • Redis 64字节分界线与跳表实现原理
  • 网站租用价格wordpress后台打开太慢
  • Kanass入门到实战(3) - 如何进行需求管理
  • Java Web项目开发实战实战指南与实战技巧
  • 基于SiC的60kW LLC变换器采用新型变压器设计
  • CSP-J初赛试题之一
  • pip下载失败-python的pip镜像源修改为国内镜像源
  • 网站开发列表名人朋友圈网页版qq登录入口
  • Jenkins Pipeline 的 `sh` 步骤里使用 ‘‘‘ ... ‘‘‘和 “““ ... “““ 的区别,一篇文章搞定
  • 金融分析师职场学习技能提升方法分享
  • 网站打包app网站备案是需要去哪里做
  • YOLOv8深度解析:从架构革新到应用实践
  • CICD流程建设之持续测试实践指南
  • 津做网站嘉兴建设企业网站
  • 广州做购物网站平面设计培训班要学多久
  • 【复习】计网每日一题--ALOHA
  • 状态机模式:用Python Enum和字典.get()构建健壮的状态管理系统
  • 悬线法,dp 求解 P4147 玉蟾宫
  • 网站建设 北京wordpress关闭站点
  • 云南建投第十建设有限公司网站商城网站开发哪家好
  • 移动固态硬盘插入电脑后提示“需要格式化”或“文件系统损坏”如何修复?
  • ErrorProne 详解
  • 理解 Elasticsearch 中的分块策略
  • 政务服务网站建设整改报告想建个购物网站
  • 网站建设中如何设置外链接网站开发在哪里接活
  • SpringCloud与微服务
  • 织梦网站统计代码app编写软件
  • Python 生成器generator的使用
  • STM32软件I2C读写AT24C64
  • valgrind与coredump调试