Pinia
Интуитивно понятный, типобезопасный и гибкий Store для Vue
Pinia работает как с Vue 2, так и с Vue 3.
Название Pinia — это самое близкое английское произношение слова «pineapple» (ананас) на испанском языке: «piña». Ананас на самом деле представляет собой группу отдельных цветов, которые соединяются вместе, образуя множественный плод. Подобно магазинам, каждый из них рождается индивидуально, но в конце концов они все связаны. Это также вкусный тропический фрукт, произрастающий в Южной Америке.
<picture>
<source srcset="https://avatars.githubusercontent.com/u/2486424?u=7b0c73ae5d090ce53bf59473094e9606fe082c59&v=4" media="(prefers-color-scheme: dark)" height="26px" alt="Stanislas Ormières" />
<img src="https://avatars.githubusercontent.com/u/2486424?u=7b0c73ae5d090ce53bf59473094e9606fe082c59&v=4" height="26px" alt="Stanislas Ormières" />
</picture>
Несколько заметок о проекте и возможных вопросах:
Q: Является ли Pinia преемником Vuex?
A: Да.
Q: Что насчёт динамических модулей?
A: Динамические модули не являются типобезопасными, поэтому вместо этого мы разрешаем создавать различные хранилища, которые можно импортировать в любом месте.
# или pnpm или yarn
npm install pinia
Если вы используете Vue <2.7, обязательно установите последнюю версию @vue/composition-api
:
npm install pinia @vue/composition-api
Создайте pinia (корневой магазин) и передайте его приложению:
// Vue 3
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
const pinia = createPinia()
const app = createApp(App)
app.use(pinia)
app.mount('#app')
// Vue 2
import { createPinia, PiniaVuePlugin } from 'pinia'
Vue.use(PiniaVuePlugin)
const pinia = createPinia()
new Vue({
el: '#app',
// другие параметры...
// ...
// обратите внимание, что один и тот же экземпляр `pinia` может использоваться в нескольких приложениях Vue на одной странице
pinia,
})
Для получения более подробных инструкций, включая конфигурацию Nuxt, см. документацию.
Вы можете создать столько хранилищ, сколько захотите, и каждое из них должно существовать в разных файлах:
import { defineStore } from 'pinia'
// main — это имя магазина. Оно уникально для вашего приложения и будет отображаться в devtools
export const useMainStore = defineStore('main', {
// функция, которая возвращает новое состояние
state: () => ({
counter: 0,
name: 'Eduardo',
}),
// необязательные геттеры
getters: {
// геттеры получают состояние в качестве первого параметра
doubleCounter: (state) => state.counter * 2,
// используйте геттеры в других геттерах
doubleCounterPlusOne(): number {
return this.doubleCounter + 1
},
},
// необязательные действия
actions: {
reset() {
// `this` — это экземпляр магазина
this.counter = 0
},
}
})
defineStore
возвращает функцию, которую необходимо вызвать, чтобы получить доступ к магазину:
import { useMainStore } from '@/stores/main'
import { storeToRefs } from 'pinia'
export default defineComponent({
setup() {
const main = useMainStore()
// извлечь конкретные свойства магазина
const { counter, doubleCounter } = storeToRefs(main)
return {
// предоставляет доступ ко всему магазину в шаблоне
main,
// даёт доступ только к определённому состоянию или геттеру
counter,
doubleCounter,
}
}
})
Чтобы узнать больше о Pinia, посетите её документацию.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )