我想弄清楚使用 Pinia 商店而不是仅使用纯 ts 可组合函数有什么优势
const userName = ref('')
export default function useUser() {
const setUserName(name: string) => {
userName.value = name
}
return {
userName: readonly(userName),
setUserName
}
}
然后使用
const {userName, setUserName} = useUser()
因为,例如在此 Vitesse 示例中 https://github.com/antfu/vitesse/blob/main/src/stores/user.ts,Pinia 的用法看起来非常相似。
感谢您的澄清:)
我找到了这个解释,它对我来说很有意义:
我觉得您可能有点忽略了可组合项和组合 API 的要点 - 它们作为“功能优先”而不是“组件优先”(字面意思是通过组合)组织代码的一种方式很有用。这意味着可组合项是共享功能,而不是状态。
某些功能可能包括内部(共享、应用程序范围)状态,但这并不是可组合项本身的目的。另一方面,Pinia 专门用于共享状态。它可能包括管理所述状态的功能,但如果没有共享状态,它就不存在。
Vue Use 是查看此“实际效果”的好地方,它是一组常用的可组合项。有些可能包含内部状态,但大多数不包含,因此只会增强组件的功能,也许会添加一些本地状态(而不是全局共享状态)
我目前在一个中型项目开始时也在为这个选择而苦苦挣扎。我认为 Pinia 实际上比普通可组合项“劣质”,因为 Pinia 会在没有明显原因的情况下制造问题,并且不会给予任何回报。
const {userName} = useUserStore(); // broken! reactivity lost
对
const {userName} = useUser(); // userName is normal ref
有
storeToRefs
,但这是一个愚蠢的仪式,而且双重愚蠢,因为你必须使用来自
storeToRefs
的参考,但来自原始商店的方法:const store = useUserStore();
const {userName, setUserName} = storeToRefs(store); // setUserName is broken!
当您从存储定义中返回引用时,这也是相当奇怪的 API,但随后它就变成了反应式对象的非引用字段。