Использование без setup()
Pinia можно использовать даже если вы не используете сomposition API (если вы используете Vue <2.7, вам все равно нужно установить плагин @vue/composition-api
). Хотя мы рекомендуем вам попробовать Composition API и изучить его, возможно, сейчас не самое подходящее время для вас и вашей команды, вы можете находиться в процессе миграции приложения или по какой-либо другой причине. Существует несколько функций:
- mapStores
- mapState
- mapWritableState
- ⚠️ mapGetters (для удобства миграции вместо этого используйте
mapState()
.) - mapActions
Предоставление доступа ко всему хранилищу
Если вам нужен доступ практически ко всему в хранилище, то может быть слишком сложно сопоставлять каждое свойство хранилища... Вместо этого вы можете получить доступ ко всему хранилищу с помощью mapStores()
:
import { mapStores } from 'pinia'
// даны два хранилища со следующими ids
const useUserStore = defineStore('user', {
// ...
})
const useCartStore = defineStore('cart', {
// ...
})
export default {
computed: {
// обратите внимание, что мы передаем не массив, а просто одно хранилище за другим
// каждое хранилище будет доступно как его id + 'Store'
...mapStores(useCartStore, useUserStore),
},
methods: {
async buyStuff() {
// используйте их где угодно!
if (this.userStore.isAuthenticated()) {
await this.cartStore.buy()
this.$router.push('/purchased')
}
},
},
}
По умолчанию Pinia добавляет суффикс "Store"
к id
каждого хранилища. Вы можете настроить это поведение, вызвав функцию setMapStoreSuffix()
:
import { createPinia, setMapStoreSuffix } from 'pinia'
// полностью удаляем суффикс: this.user, this.cart
setMapStoreSuffix('')
// this.user_store, this.cart_store (ничего страшного, я вас не осуждаю)
setMapStoreSuffix('_store')
export const pinia = createPinia()
TypeScript
По умолчанию все map-помощники поддерживают автозавершение, и вам не нужно ничего делать. Если вы вызываете setMapStoreSuffix()
, чтобы изменить суффикс "Store",
вам также потребуется добавить его где-то в файле TS или в файле global.d.ts
. Самым удобным местом было бы то же место, где вы вызываете setMapStoreSuffix()
:
import { createPinia, setMapStoreSuffix } from 'pinia'
setMapStoreSuffix('') // полностью удалить суффикс
export const pinia = createPinia()
declare module 'pinia' {
export interface MapStoresCustomization {
// установить его в то же значение, что и выше
suffix: ''
}
}
Предупреждение
Если вы используете файл декларации TypeScript (например, global.d.ts
), не забудьте указать в его верхней части import 'pinia'
для раскрытия всех существующих типов.