Pinia 存储与可组合函数

问题描述 投票:0回答:2

我想弄清楚使用 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 的用法看起来非常相似。

感谢您的澄清:)

javascript typescript vue.js function-composition
2个回答
8
投票

我找到了这个解释,它对我来说很有意义:

我觉得您可能有点忽略了可组合项和组合 API 的要点 - 它们作为“功能优先”而不是“组件优先”(字面意思是通过组合)组织代码的一种方式很有用。这意味着可组合项是共享功能,而不是状态。

某些功能可能包括内部(共享、应用程序范围)状态,但这并不是可组合项本身的目的。另一方面,Pinia 专门用于共享状态。它可能包括管理所述状态的功能,但如果没有共享状态,它就不存在。

Vue Use 是查看此“实际效果”的好地方,它是一组常用的可组合项。有些可能包含内部状态,但大多数不包含,因此只会增强组件的功能,也许会添加一些本地状态(而不是全局共享状态)

来源:https://www.reddit.com/r/vuejs/comments/t88xzy/comment/hzmoet2/?utm_source=share&utm_medium=web2x&context=3


1
投票

我目前在一个中型项目开始时也在为这个选择而苦苦挣扎。我认为 Pinia 实际上比普通可组合项“劣质”,因为 Pinia 会在没有明显原因的情况下制造问题,并且不会给予任何回报。

    Pinia 打破了对象解构,非常方便:
  1. 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,但随后它就变成了反应式对象的非引用字段。

  2. Pinia 做出了虚假承诺 - 宣称的开发工具支持实际上是初级的。带有官方插件的官方开发工具中没有时间线或时间旅行。您只能在单独的开发工具选项卡中获取商店,但您仍然可以在没有 Pinia 的情况下到达可组合项的状态。
  3. 由于打破了裁判,Pinia 提倡一种将反应性隐藏在抹布下的风格,而不是清楚地识别什么是裁判,什么不是裁判,从而增加了错误。
© www.soinside.com 2019 - 2024. All rights reserved.