我有几个 Pinia 商店,它们应该共享一组操作和 getter,但我不太确定如何有效地实现这一点。
我正在构建一个应用程序,让用户可以管理多种不同的媒体(书籍、电影、电视节目等)。我目前考虑的方式是为每种媒体类型建立一个商店,例如BookStore、MovieStore 等。这些不同商店之间的许多 getter 和操作(例如 count
和 deleteOne
)完全相同。
如何在这里实现 DRY? Pinia 文档中的示例主要集中在其他商店内重用操作和 getter,但我认为这并不能完全解决我直接继承一组 getter 和 setter 的用例。
我在这里尝试的继承方法是反模式吗?
如果您想让某些功能在并非所有商店之间共享,您可以使用可组合方式。
您可以创建一个单独的可组合函数并将商店实例的一部分传递给其中。
我在 codesandbox 上做了一个例子为你。
这里是codesandbox的简短示例:
common.ts
然后在任何商店中您都可以像这样使用它:
fooStore.ts
通过这种方式,您可以在任何存储或任何组件中组合任何函数、对象等。
这可以使用插件来实现 docs
示例电影:
您有多个商店,每个州都使用共享命名方案:
每个商店都会有相同的 CRUD 操作,只是 URL 发生变化
创建插件:
给 Pinia 提供插件:
示例 movieStore.js(使用共享操作和状态)
组件中的使用示例
编辑:1
如果您将上下文传递到插件中,您就可以访问商店和传递到其中的选项,从中您可以检查商店 ID,并且仅返回特定商店,如下所示
我使用 3 个商店创建了一个非常基本的示例,上面的检查可在 codesandbox 此处