从源码视角来看Pinia!

news/2026/1/22 23:51:20/文章来源:https://www.cnblogs.com/haoxiugong/p/19519345

一、Pinia 概览

Pinia 本质是:「基于 Vue3 响应式系统 + effectScope 的“全局可控副作用容器”」

Pinia 核心代码集中在:

packages/pinia/src/
├── createPinia.ts
├── rootStore.ts
├── store.ts
├── subscriptions.ts
├── types.ts
┌─────────────────────┐
│   用户 API 层        │  defineStore / storeToRefs
├─────────────────────┤
│   Store 实现层       │  setupStore / optionsStore
├─────────────────────┤
│   响应式 & 调度层     │  reactive / effectScope / watch
└─────────────────────┘

二、createPinia 全局容器

2.1 createPinia 核心

export function createPinia() {const scope = effectScope(true)const state = scope.run(() => ref({}))!const pinia = markRaw({_e: scope,_s: new Map(), // store 注册state,install(app) {setActivePinia(pinia)app.provide(piniaSymbol, pinia)}})return pinia
}

① 全局 effectScope

const scope = effectScope(true)

所有 store 的 effect / computed / watch,全部挂在这个全局 scope(作用域) 下

这意味着 pinia._e.stop() 就能一次性销毁所有 store 副作用

② 全局 state 容器

const state = ref({})

Pinia 并不是每个 store 自己维护 root state。

而是 pinia 统一管理,然后由 storeId 区分 state 属于哪个 store:

pinia.state.value[storeId] = storeState // storeId 就是我们通过 defineStore 创建 store 的第一个参数

三、defineStore 定义 store

export function defineStore(id, setupOrOptions) {return function useStore() {const pinia = getActivePinia()if (!pinia._s.has(id)) {createStore(id, setupOrOptions, pinia)}return pinia._s.get(id)}
}

Pinia 内部其实有 ​两种 store​:

3.1 setupStore 核心流程

function setupStore(id, setup, pinia) {const scope = effectScope()const store = reactive({})const setupResult = scope.run(() =>setup({ action }))for (const key in setupResult) {const prop = setupResult[key]store[key] = prop}pinia._s.set(id, store)
}

① 每个 store 自己也有一个 effectScope

const scope = effectScope()

层级关系:

Pinia Root Scope└── Store Scope├── computed├── watch└── effect

所以,store.$dispose() ⇒ stop 当前 store 的所有副作用,不影响其他 store

② store 是 reactive 包裹的对象

const store = reactive({})

​注意:​Pinia ​不包装 state,​Pinia 包装的是整个 store

所以:

store.count
store.double
store.increment

全部是同一个 reactive proxy。

如果通过 Setup Store 创建:

const count = ref(0)
return { count }
store.count === count // true // 本质上 Pinia 直接复用 Vue 原生响应式对象

如果是 options store :

state: () => ({ count: 0 })
pinia.state.value[id] = reactive(state())

然后:

store.count -> toRef(pinia.state.value[id], 'count')

所以:

store.count++ // 实际修改的是 pinia.state

四、getters 的底层原理(computed)

Options Store 的 getter:

getters: {double: (state) => state.count * 2
}

源码实现本质:

computed(() => {setActivePinia(pinia)return getter.call(store, store)
})

本质结论:

Pinia getter == Vue computed

  • 依赖收集由 Vue 完成
  • 脏检查、缓存完全交给 computed

五、actions

actions: {increment() {this.count++}
}

源码:

function wrapAction(name, action) {return function () {return action.apply(store, arguments)}
}

六、其他 API

6.1 $patch:为什么比直接改 state 更好?

store.$patch({count: store.count + 1
})

源码:

pauseTracking()
applyPatch() // 批量更新,暂停追踪依赖
resumeTracking()
triggerSubscriptions() // 统一触发

6.2 $subscribe / watch 的关系(副作用系统)

store.$subscribe((mutation, state) => {})

源码:

watch(() => pinia.state.value[id],(state) => callback(),{ deep: true }
)

Pinia 的 subscribe 就是一个封装过的 watch

但多做了:mutation 类型、时间戳、devtools hook

6.3 storeToRefs:为什么不会丢响应式?

const { count } = storeToRefs(store)

源码:

if (isRef(value) || isReactive(value)) {refs[key] = toRef(store, key)
}

storeToRefs = 批量 toRef

七、Pinia vs Vuex(源码级简单对比)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1202157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026年国产持妆粉底液厂家专业深度测评(排名前五)

2026年国产持妆粉底液十大排名权威发布 一、开篇(定调 + 公示 + 声明) 随着国内美妆行业研发实力与消费者需求的同步升级,市场对兼具长效持妆与卓越妆效的国产持妆粉底液需求持续攀升。为帮助消费者在众多产品中做出…

2026年国产持妆粉底液专业深度测评:排名前五品牌权威发布

2026年国产持妆粉底液专业深度测评:排名前五品牌权威发布 随着国内美妆市场研发实力与消费者认知的同步升级,国产持妆粉底液在配方技术、妆效表现及持妆时长上已实现显著突破。为帮助消费者在纷繁的产品中做出精准决…

2026年国产持妆粉底液专业深度测评:排名前五供应商权威榜单

2026年国产持妆粉底液专业深度测评:排名前五供应商权威榜单 一、开篇(定调 + 公示 + 声明) 随着国货美妆研发实力与消费者认知的持续攀升,市场对兼具长效持妆与卓越妆效的国产持妆粉底液需求日益精细化。为帮助消费…

初学范畴论的一些体会

休学时间正好在家把范畴论学一下,感觉这东西对模型论视角下的可计算性的理解有大帮助教材:Basic Category Theory - Tom Leinster, Cambridge studies in advanced mathematics

2026年专业深度测评:国产持妆粉底液厂家排名前五权威榜单

2026年专业深度测评:国产持妆粉底液厂家排名前五权威榜单 一、开篇:测评背景与声明 随着国货美妆研发实力与市场认知度的双重跃升,消费者对国产持妆粉底液的妆效持久度、肤质适配性及成分安全提出了更高要求。为精准…

2026毕业论文降AI必备:这5款工具帮你AI率降到10%以下

2026毕业论文降AI必备:这5款工具帮你AI率降到10%以下 TL;DR 太长不看:2026年高校普遍要求毕业论文AI率低于30%才能答辩,知网检测算法又升级了。实测5款降AI工具,嘎嘎降AI可将AI率从99.5%降到3.1%,比话降AI承诺知网AI率…

【计算机毕业设计案例】基于springboot的就业招聘面试试题管理系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026年8款免费降AI率工具实测推荐,毕业生必看

2026年8款免费降AI率工具实测推荐,毕业生必看 TL;DR 太长不看:测试了市面上十几款降AI工具,最后筛出8款真正能用的。其中嘎嘎降AI效果最稳(知网62.7%→5.8%),比话降AI自研引擎改写更自然,都提供…

【计算机毕业设计案例】基于SpringBoot+Vue咖啡售卖商城平台的设计与实现基于springboot的咖啡共赏平台(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

毕业生必看:知网AIGC检测不通过怎么办?超全解决方案

毕业生必看:知网AIGC检测不通过怎么办?超全解决方案 TL;DR 太长不看:知网AIGC检测不通过不用慌,按这4步走:分析检测报告定位高风险段落→手动调整最明显的AI痕迹→用专业工具深度处理(推荐比话降AI知网专属…

解决 Java UnsatisfiedLinkError: libfontmanager.so 加载失败问题

在 Java 项目部署和运行过程中,UnsatisfiedLinkError: libfontmanager.so 是一类高频的系统级链接错误,尤其在 Docker 精简镜像、最小化安装的 Linux 服务器环境中极易出现。该错误会直接导致 Java 程序中涉及 PDF 生成、Excel 导出、图形渲染、字体渲染等功能崩溃,影响业务…

Java毕设项目推荐-基于springboot的面试试题管理系统基于springboot面试刷题平台系统的设计与实现【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

长春婚纱照,记录下你们爱情故事中的每一个动人瞬间

在长春的婚纱摄影中,每一张照片都在讲述你们的爱情故事。专业的摄影师会利用城市独特的景色,捕捉到你们之间的深厚情感。无论是在阳光明媚的公园,还是历史悠久的建筑前,都会让每个瞬间都变得动人。在规划拍摄时,了解合…

Java毕设项目推荐-基于springboot在线咖啡点单平台基于springboot的咖啡共赏平台【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

基于微信小程序的汽车维修预约系统【源码+文档+调试】

🔥🔥作者: 米罗老师 🔥🔥个人简介:混迹java圈十余年,精通Java、小程序、数据库等。 🔥🔥各类成品Java毕设 。javaweb,ssm,springboot等项目&#…

学习日记day65

Day65_0122 专注时间:目标是:5h30~6h。实际:5h11min 每日任务:饭后的休息(25min),学习间歇的休息(15min)都用手表计时器来监督 {step1}40min二刷1道力扣hot100昨天的题…

基于微信小程序的企业会议预约系统【源码+文档+调试】

🔥🔥作者: 米罗老师 🔥🔥个人简介:混迹java圈十余年,精通Java、小程序、数据库等。 🔥🔥各类成品Java毕设 。javaweb,ssm,springboot等项目&#…

手把手教你学Simulink--风电电机控制场景实例:基于Simulink的风电变流器死区补偿与非线性校正仿真

目录 手把手教你学Simulink 一、引言:为什么风电变流器需要“死区补偿”? 二、死区效应机理分析 1. 死区导致的电压误差 2. 误差电压表达式(近似) 三、系统整体架构 四、Simulink 建模全流程 步骤1:主电路建模(含真实死区) 步骤2:电流采样与极性判断 步骤3:…

全网最全8个一键生成论文工具,本科生轻松搞定毕业论文!

全网最全8个一键生成论文工具,本科生轻松搞定毕业论文! AI 工具如何助力论文写作,让本科生轻松应对毕业挑战 随着人工智能技术的不断发展,越来越多的 AI 工具被应用于学术写作领域,尤其是对于本科生而言,这…

《创业之路》-865-创新扩散理论以及在投资、创业中的应用

创新扩散理论(Diffusion of Innovations Theory) 是由美国社会学家 埃弗雷特罗杰斯(Everett M. Rogers) 在1962年提出的经典理论,用于解释新思想、新技术或新产品如何在社会系统中被传播和采纳的过程。 这一理论不仅广…