v3 中的storeToRefs

Source

storeToRefs() 解析

storeToRefs() 是 Pinia (Vue 3 的状态管理库) 提供的一个实用函数,用于从 Pinia store 中提取属性并保持其响应性。

基本作用

storeToRefs() 的主要功能是:

  1. 保持响应性:将 Pinia store 中的状态属性转换为 ref 引用,保持其响应性
  2. 解构友好:允许你解构 store 的属性而不会失去响应性
  3. 仅转换状态:只转换状态属性,跳过方法和非响应式属性

为什么需要它?

在 Vue 3 的 Composition API 中,直接解构 Pinia store 会导致失去响应性:

const userStore = useUserStore()
const { username } = userStore // ❌ 解构后 username 不再是响应式的

使用 storeToRefs() 可以解决这个问题:

const userStore = useUserStore()
const { username } = storeToRefs(userStore) // ✅ 现在 username 是响应式的 ref

使用示例

import { storeToRefs } from 'pinia'
import { useUserStore } from '@/stores/user'

// 在组件中
const userStore = useUserStore()

// 使用 storeToRefs 解构状态
const { username, email, isAdmin } = storeToRefs(userStore)

// 直接访问方法 (不需要 storeToRefs)
const { login, logout } = userStore

与 Vuex 的比较

在 Vuex 中,你需要使用 computed() 来保持响应性:

// Vuex 方式
import { computed } from 'vue'
import { useStore } from 'vuex'

const store = useStore()
const username = computed(() => store.state.user.username)

而 Pinia 的 storeToRefs() 提供了更简洁的语法。

注意事项

  1. 只用于状态:不要用它来解构 actions/getters
  2. 模板中使用:在模板中可以直接使用,不需要 .value
  3. 组合式函数:在组合式函数中使用时特别有用
  4. 性能:比直接访问 store 属性有轻微开销,但对大多数应用可以忽略

实现原理

storeToRefs() 本质上会遍历 store 的所有属性,将响应式状态转换为 ref 对象,同时跳过方法和非响应式属性。

它是 Pinia 提供的一个便捷工具,让开发者能更方便地使用 Composition API 与状态管理集成。