目录
什么是storeToRefs?
storeToRefs
是 Vue 3 中 Pinia 状态管理库提供的一个实用函数,它可以将 store 中的状态和 getters 转换为响应式引用 (refs
)。这样做的好处是可以解构 store 中的状态,同时保持响应式特性。
问题背景
在 Vue 3 中,使用 reactive
或 ref
创建的响应式对象,如果直接解构,解构后的属性将失去响应式特性。而store是一个用reactive包装的对象,为了解决这个问题,Pinia 提供了 storeToRefs
,允许你在解构 store 的属性时,仍然保持它们的响应性。
使用示例
假设我们有一个简单的 Pinia store:
// stores/counter.js
import { defineStore } from 'pinia';
export const useCounterStore = defineStore('counter', {
state: () => ({
count: 0,
}),
getters: {
doubleCount: (state) => state.count * 2,
},
actions: {
increment() {
this.count++;
},
},
});
在组件中使用 storeToRefs
:
<template>
<div>
<p>Count: {{ count }}</p>
<p>Double Count: {{ doubleCount }}</p>
<button @click="increment">Increment</button>
</div>
</template>
<script setup>
import { useCounterStore } from './stores/counter';
import { storeToRefs } from 'pinia';
const counterStore = useCounterStore();
const { count, doubleCount } = storeToRefs(counterStore); // 将状态和 getter 解构为 refs
const { increment } = counterStore; // 直接解构 action
</script>
关键点:
storeToRefs
用于将 store 的 state 和 getters 转换为 refs,使它们在解构后保持响应性。- Actions 不需要通过
storeToRefs
解构,它们可以直接解构使用。 storeToRefs
可以避免丢失响应式特性,在解构 store 状态时尤其有用。
注意:上面定义store使用的是Option store方法,也可以使用Setup store方式,可根据这篇博客进行对照:Pinia的基本语法
为什么要使用 storeToRefs
?
在 Vue 3 中,当你从 store 中直接解构出多个属性时,这些属性将不再保持响应性。storeToRefs
的作用就是确保这些属性在解构后依然是响应式的 refs。
总结
storeToRefs
是 Pinia 提供的一个便捷工具,用于安全地解构 store 中的响应式状态和 getters,确保它们在解构后依然能够响应数据的变化。