浅谈 storeToRefs

概述

storeToRefs 是专门用来把 Pinia store 解构成「仍然有响应性 + 完整 TS 提示」的 refs 工具。


一、storeToRefs 是干嘛的?

问题背景

ts 复制代码
const store = useUserStore()
const { name } = store   // ❌ 响应性断了 + TS 变弱

解决方案

ts 复制代码
import { storeToRefs } from 'pinia'

const store = useUserStore()
const { name } = storeToRefs(store) // ✅

结果:

  • nameRef<string>
  • 响应性不丢
  • TS 自动补全、类型检查完整

二、它到底"帮你做了什么"?

storeToRefs(store) 会:

  1. 只处理

    1. state
    2. getters
  2. 跳过

    1. actions
  3. 把它们统一包成 ref / computed

可以把它理解成:

ts 复制代码
// 伪代码
{
  stateKey: toRef(store, 'stateKey'),
  getterKey: computed(() => store.getterKey),
}

三、TS 类型长什么样?

Store 定义

ts 复制代码
export const useUserStore = defineStore('user', {
  state: () => ({
    name: 'Tom',
    age: 18,
  }),
  getters: {
    isAdult: (state) => state.age >= 18,
  },
  actions: {
    setName(name: string) {
      this.name = name
    },
  },
})

使用 storeToRefs

ts 复制代码
const store = useUserStore()
const { name, age, isAdult } = storeToRefs(store)

TS 推导结果

ts 复制代码
name      // Ref<string>
age       // Ref<number>
isAdult   // ComputedRef<boolean>

✔ 不会是 any ✔ 不会丢 getter 类型 ✔ 自动区分 Ref / ComputedRef


四、为什么 actions 不能放进去?

ts 复制代码
const { setName } = storeToRefs(store) // ❌ 不存在

因为:

  • action 是普通函数
  • 不需要响应性
  • 包成 ref 反而会破坏 this / 调用方式

👉 正确做法:

ts 复制代码
const { setName } = store

五、最标准、最推荐的组合写法

ts 复制代码
const store = useUserStore()

const { name, age, isAdult } = storeToRefs(store)
const { setName } = store

这是 Pinia 官方文档 + 实战 都默认的模式。


六、模板里为什么不用 .value

ts 复制代码
<script setup lang="ts">
  const store = useUserStore()
  const { name } = storeToRefs(store)
</script>
<template>
  {{ name }} <!-- 自动 unref -->
</template>
  • Vue template 会自动 unref
  • TS 仍然认为它是 Ref<string>
  • 两边都正确 ✅

七、什么时候一定要用 storeToRefs

✅ 必须用

  • setup() / script setup 里解构 store
  • 想保留响应性 + TS 提示
  • 把 store 拆开传给 composable

❌ 不用

store.name store.isAdult store.setName()

不解构 = 不需要 storeToRefs


八、总结

Pinia 解构三原则

  • 解构 state / getters 👉 storeToRefs
  • 解构 actions 👉 直接解
  • 能不解构就不解构(TS 最稳)
相关推荐
陈随易2 小时前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
Highcharts.js3 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
To_OC3 小时前
我被 useState 坑了两次之后,终于把它的脾气摸透了
前端·javascript·react.js
鱼樱前端3 小时前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
_lucas3 小时前
给知识库网站接入AI问答
前端·ai编程·全栈
前端糕手4 小时前
前端面试题大全:JavaScript + Vue3 + React + TypeScript + 工程化 + 性能优化
前端
我不叫武5 小时前
一个用 Rust 写的离线编码查询桌面工具
前端
Web4Browser6 小时前
指纹浏览器 API 自动化怎么接:启动 Profile、获取 CDP 端点并连接自动化框架
前端·网络·typescript·自动化
Patrick_Wilson6 小时前
从 React 到 Flutter:写给前端的一张跨端知识地图
前端·flutter·react.js
颜酱6 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端