定义 Store ​✨自信地编写 Vue 应用的 Vibe 代码RuleKit通过 Mastering Pinia 的免费视频掌握更多内容在深入研究核心概念之前,我们得知道 Store 是用 defineStore() 定义的,它的第一个参数要求是一个独一无二的名字:

jsimport { defineStore } from 'pinia'

// `defineStore()` 的返回值的命名是自由的

// 但最好含有 store 的名字,且以 `use` 开头,以 `Store` 结尾。

// (比如 `useUserStore`,`useCartStore`,`useProductStore`)

// 第一个参数是你的应用中 Store 的唯一 ID。

export const useAlertsStore = defineStore('alerts', {

// 其他配置...

})这个名字 ,也被用作 id ,是必须传入的, Pinia 将用它来连接 store 和 devtools。为了养成习惯性的用法,将返回的函数命名为 use... 是一个符合组合式函数风格的约定。

defineStore() 的第二个参数可接受两类值:Setup 函数或 Option 对象。

Option Store ​与 Vue 的选项式 API 类似,我们也可以传入一个带有 state、actions 与 getters 属性的 Option 对象

jsexport const useCounterStore = defineStore('counter', {

state: () => ({ count: 0, name: 'Eduardo' }),

getters: {

doubleCount: (state) => state.count * 2,

},

actions: {

increment() {

this.count++

},

},

})你可以认为 state 是 store 的数据 (data),getters 是 store 的计算属性 (computed),而 actions 则是方法 (methods)。

为方便上手使用,Option Store 应尽可能直观简单。

Setup Store ​也存在另一种定义 store 的可用语法。与 Vue 组合式 API 的 setup 函数 相似,我们可以传入一个函数,该函数定义了一些响应式属性和方法,并且返回一个带有我们想暴露出去的属性和方法的对象。

jsexport const useCounterStore = defineStore('counter', () => {

const count = ref(0)

const name = ref('Eduardo')

const doubleCount = computed(() => count.value * 2)

function increment() {

count.value++

}

return { count, name, doubleCount, increment }

})在 Setup Store 中:

ref() 就是 state 属性computed() 就是 gettersfunction() 就是 actions注意,要让 pinia 正确识别 state,你必须在 setup store 中返回 state 的所有属性。这意味着,你不能在 store 中使用私有属性。不完整返回会影响 SSR ,开发工具和其他插件的正常运行。

Setup store 比 Option Store 带来了更多的灵活性,因为你可以在一个 store 内创建侦听器,并自由地使用任何组合式函数。不过,请记住,使用组合式函数会让 SSR 变得更加复杂。

Setup store 也可以依赖于全局提供的属性,比如路由。任何应用层面提供的属性都可以在 store 中使用 inject() 访问,就像在组件中一样:

tsimport { inject } from 'vue'

import { useRoute } from 'vue-router'

import { defineStore } from 'pinia'

export const useSearchFilters = defineStore('search-filters', () => {

const route = useRoute()

// 这里假定 `app.provide('appProvided', 'value')` 已经调用过

const appProvided = inject('appProvided')

// ...

return {

// ...

}

})WARNING

不要返回像 route 或 appProvided (上例中)之类的属性,因为它们不属于 store,而且你可以在组件中直接用 useRoute() 和 inject('appProvided') 访问。

你应该选用哪种语法? ​和在 Vue 中如何选择组合式 API 与选项式 API 一样,选择你觉得最舒服的那一个就好。两种语法都有各自的优势和劣势。Option Store 更容易使用,而 Setup Store 更灵活和强大。如果你想深入了解两者之间的区别,请查看 Mastering Pinia 中的 Option Stores vs Setup Stores 章节。

使用 Store ​虽然我们前面定义了一个 store,但在我们使用 TIP

如果你还不会使用 setup 组件,你也可以通过映射辅助函数来使用 Pinia。

你可以定义任意多的 store,但为了让使用 pinia 的益处最大化(比如允许构建工具自动进行代码分割以及 TypeScript 推断),你应该在不同的文件中去定义 store。

一旦 store 被实例化,你可以直接访问在 store 的 state、getters 和 actions 中定义的任何属性。我们将在后续章节继续了解这些细节,目前自动补全将帮助你使用相关属性。

请注意,store 是一个用 reactive 包装的对象,这意味着不需要在 getters 后面写 .value。就像 setup 中的 props 一样,我们不能对它进行解构:

vue从 Store 解构 ​为了从 store 中提取属性时保持其响应性,你需要使用 storeToRefs()。它将为每一个响应式属性创建引用。当你只使用 store 的状态而不调用任何 action 时,它会非常有用。请注意,你可以直接从 store 中解构 action,因为它们也被绑定到 store 上:

vue

Copyright © 2088 世界杯欧洲区_世界杯中国 - rd508.com All Rights Reserved.
友情链接