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

storeToRefs

storeToRefs 是 Pinia 提供的一个工具函数,用于在组合式 API(Composition API)中解构 Store 的状态(state)或计算属性(getters)时保持响应性。以下是它的具体用法和示例:


为什么需要 storeToRefs

当直接从 Store 解构 stategetters 时,解构后的值会失去响应性(类似直接解构 reactive 对象)。使用 storeToRefs 可以将这些属性转换为 ref,确保解构后依然保持响应性。


使用方法

  1. 导入 storeToRefs
  2. 通过 useXxxStore 获取 Store 实例
  3. storeToRefs 包裹 Store 实例,解构需要的属性
import { storeToRefs } from 'pinia'
import { useUserStore } from '@/stores/user'

const userStore = useUserStore()
const { name, age, isAdult } = storeToRefs(userStore) // 解构并保持响应性

示例对比

错误用法(失去响应性)
<script setup>
import { useUserStore } from '@/stores/user'

const userStore = useUserStore()
const { name, age } = userStore // ❌ 直接解构,失去响应性!

const changeName = () => {
  userStore.name = 'Bob' // 修改 Store 中的 name
  console.log(name) // 这里不会更新,因为解构后的 name 是普通值
}
</script>

<template>
  <p>{{ name }}</p> <!-- 不会响应式更新 -->
</template>
正确用法(使用 storeToRefs
<script setup>
import { storeToRefs } from 'pinia'
import { useUserStore } from '@/stores/user'

const userStore = useUserStore()
const { name, age, isAdult } = storeToRefs(userStore) // ✅ 保持响应性

const changeName = () => {
  userStore.name = 'Bob' // 或 name.value = 'Bob'
}
</script>

<template>
  <p>{{ name }}</p> <!-- 响应式更新 -->
  <p>{{ age }}</p>
  <p>{{ isAdult }}</p>
</template>

注意事项

  1. 仅解构 stategetters
    storeToRefs 会忽略 Store 中的 Actions(方法),因为它们是函数,不需要响应性。
    如果需要调用方法,直接从 Store 实例调用:

    const userStore = useUserStore()
    const { updateUser } = userStore // ✅ 直接解构方法即可
    
  2. 修改值的方式
    解构后的 ref 需要通过 .value 修改:

    const { name } = storeToRefs(userStore)
    name.value = 'Charlie' // ✅ 正确
    
  3. 对比 toRefs
    storeToRefs 是 Pinia 对 toRefs 的封装,专门针对 Store 的优化,能正确处理 getters


完整示例

<script setup>
import { storeToRefs } from 'pinia'
import { useCounterStore } from '@/stores/counter'

const counter = useCounterStore()
const { count, doubleCount } = storeToRefs(counter) // 解构 state 和 getter

const increment = () => {
  counter.increment() // 直接调用 Action
}
</script>

<template>
  <div>
    <p>Count: {{ count }}</p> <!-- 响应式 -->
    <p>Double: {{ doubleCount }}</p> <!-- 响应式 -->
    <button @click="increment">+1</button>
    <button @click="count++">直接修改 count</button> <!-- 通过 .value 简写 -->
  </div>
</template>

总结

  • 使用场景:在组合式 API 中需要解构 Store 的 stategetters 时,用 storeToRefs 保持响应性。
  • 核心作用:将 Store 的响应式属性转换为 ref,避免解构后失去响应性。
  • 避免直接解构:除非你明确知道不需要响应性(如只读取一次值)。

相关文章:

  • 【C#】合理使用DeepSeek相关AI应用为我们提供强有力的开发工具,在.net core 6.0框架下使用JsonNode动态解析json字符串,如何正确使用单问号和双问号做好空值处理
  • 基于分类算法的学习失败预警(下)
  • 函数的介绍
  • 降低时间复杂度---特殊方程的正整数解(双指针)
  • java八股文之常见的集合
  • DeepSeek 模型的成本效益深度解析:低成本、高性能的AI新选择
  • 深入理解【双指针】:从基础概念到实际例题
  • 【实测】单卡跑满血版DeepSeek|CSGHub集成KTransformers
  • 算法——广度优先搜索——跨步迷宫
  • Spark大数据分析与实战笔记(第四章 Spark SQL结构化数据文件处理-01)
  • Java 并发集合:ConcurrentHashMap 深入解析
  • 「C++输入输出」笔记
  • 上取整,下取整,四舍五入
  • IC/ID卡的卡号的不同格式的转换
  • created在vue3 script setup中的写法
  • redis搭建一主一从+keepalived(虚拟IP)实现高可用
  • 【8】分块学习笔记
  • 修改War包文件
  • PTA C语言程序设计 第三章
  • linux Redhat9.5采用DNS主从实现跨网段解析
  • 母亲节书单|关于生育自由的未来
  • 韩国执政党总统候选人更换方案被否决,金文洙候选人资格即刻恢复
  • 家电维修担心遇“李鬼”?上海推动“物业+专业服务”进社区
  • 中俄弘扬正确二战史观:缅怀历史,重拾初心,阻止悲剧重演
  • 外卖员投资失败负疚离家流浪,经民警劝回后泣不成声给父母下跪
  • 洞天寻隐·学林纪丨玉洞桃源:仇英青绿山水画中的洞天与身体