Каталог статей
1. Введение в Пинию
Управление состоянием — важная концепция в разработке современных веб-приложений. Библиотека управления состоянием в Vue 3 Pinia
— это Vue 3 Composition API
библиотека управления состоянием, основанная на Vue, которая обеспечивает простой и гибкий способ управления состоянием приложения, а также производительность и масштабируемость . Pinia
В некотором смысле его также можно назвать Vuex5
, потому что он объединяет Vuex 5
множество идей в обсуждении основной группы, поэтому он заменен Pinia
новой схемой рекомендацийVuex
.
2. Преимущества Пинии
- Поддержка инструментов разработчика
- трек
actions
,mutations
таймлайн - Отобразите их в компонентах, используя
Store
- упростить отладку
Time travel
- трек
- горячее обновление
- Можно изменить без перезагрузки страницы
Store
- При разработке вы можете сохранить текущую
State
- Можно изменить без перезагрузки страницы
- напрямую через данные в
actions
модификацииstate
. Устаревшийmutation
. - Именованных модулей больше нет . Отменено , каждый модуль
vuex
независимmodule
Pinia
- плагин .
Pinia
Функциональность может быть расширена плагинами - лучшая
TypeScript
поддержка . Предусмотрена функция завершения кода, чтобы избежать внедрения слишком большого количества магических строк. - Поддержка рендеринга на стороне сервера .
- Меньший размер . Только 2,1 КБ после сжатия
3. Установка и использование Pinia
3.1. Установка
Установить Pinia очень просто, просто используйте npm или yarn для установки:
npm install pinia
# 或
yarn add pinia
3.2 Использование
3.1.1. Создайте магазин Pinia
Создать магазин Pinia очень просто, вот простой пример:
Tips
Что касается именования магазина Pinia, официально рекомендуемым методом является use+name+Store .
import {
defineStore } from 'pinia'
// 你可以对 `defineStore()` 的返回值进行任意命名,但最好使用 store 的名字,同时以 `use` 开头且以 `Store` 结尾。(比如 `useUserStore`,`useCartStore`,`useProductStore`)
// 第一个参数是你的应用中 Store 的唯一 ID。
export const useCounterStore = defineStore({
id: "counter",
state: () => ({
count: 0,
}),
actions: {
increment() {
this.count++;
},
decrement() {
this.count--;
},
},
getters: {
doubleCount: ({
count }) => count * 2,
},
});
В приведенном выше коде мы сначала используем defineStore
функцию для создания useCounterStore
магазина Pinia с именем , state
затем определяем count
свойство в функции и, actions
наконец определяем дваincrement
метода в объекте для изменения свойства.decrement
count
Конечно, мы также можем определить Store с помощью функции:
import {
ref, computed } from "vue";
// 你可以对 `defineStore()` 的返回值进行任意命名,但最好使用 store 的名字,同时以 `use` 开头且以 `Store` 结尾。(比如 `useUserStore`,`useCartStore`,`useProductStore`)
// 第一个参数是你的应用中 Store 的唯一 ID。
export const useCounterStore = defineStore('counter', () => {
const count = ref(0)
const doubleCount = computed(() => count.value * 2);
function increment() {
count.value++
}
function decrement() {
count.value--
}
return {
count, doubleCount, increment, decrement }
})
3.2.2 Использование Pinia Store в компонентах
Чтобы использовать Pinia Store в компоненте, нам нужно импортировать Store.
<script setup lang="ts">
import {
useCounterStore } from "@/stores/counter";
const counterStore = useCounterStore()
// 注意此处不能直接采用结构赋值的方法:如 const { count, doubleCount } = useCounterStore()
// 这样会让数据失去响应性
</script>
Если вы хотите назначить структуру, вам нужно импортировать функцию storeToRefs, чтобы превратить деструктурированные параметры в адаптивные:
<script setup lang="ts">
import {
storeToRefs } from 'pinia'
import {
useCounterStore } from "@/stores/counter";
const counterStore = useCounterStore()
// 将解构出来的参数变成响应式
const {
count, doubleCount } = storeToRefs(counterStore)
// 作为 action 的 increment 和 decrement 可以直接解构
const {
increment, decrement } = counterStore
</script>
3.2.3 Использование Pinia Store в шаблонах
Чтобы использовать Pinia Store в шаблоне, мы просто используем его непосредственно в шаблоне.
<template>
<div>
<p>Count: {
{ counterStore.count }}</p>
<p>doubleCount: {
{ counterStore.doubleCount }}</p>
<button @click="counterStore.increment()">Increment</button>
<button @click="counterStore.decrement()">Decrement</button>
</div>
</template>
4. Управление состоянием и потоком данных Pinia
-
В России
Pinia
концепции управления состоянием и потока данных очень важны. Управление состоянием относится к сохранению состояния приложения в централизованном месте, а также к изменению и запросу состояния с помощью некоторых методов . Поток данных относится к тому, как данные передаются в приложении , включая источник , передачу , обработку и хранение данных . -
В
Pinia
, мы можем использоватьStore
для управления состоянием приложения, а также использоватьActions
иGetters
для изменения и запроса состояния.Store
это объект, содержащий состояние, действия и геттеры, которые могут совместно использоваться несколькими компонентами . Когда компоненту необходимо изменить или запросить состояние, он можетStore
получить доступ к состоянию, вызвав соответствующийActions
илиGetters
для изменения или запроса состояния. -
В
Pinia
, способ передачи данных очень прост и интуитивно понятен. Когда компонент вызываетсяStore
дляActions
изменения состояния, данные передаются от компонента к другим компонентамStore
и обратно .Store
Когда компонент вызываетStore
состояниеGetters
запроса, данныеStore
передаются от компонента к компоненту. Такой способ передачи данных очень прост и управляем , что позволяет нам лучше управлять и поддерживать состояние приложения .
5. Модульность и пространства имен Pinia
В Pinia мы можем использовать модуляризацию и пространства имен для организации хранилищ, чтобы лучше управлять и поддерживать состояние приложения. Модульность и пространства имен могут помочь нам разделить состояние приложения на логические модули и объединить их в полное состояние приложения. Этот модульный подход и подход к пространству имен очень понятный и управляемый, что позволяет нам лучше управлять и поддерживать состояние приложения.
5.1 Модульность
В Pinia мы можем использовать defineStore
эту функцию для определения Store. defineStore
Функция может принимать объект параметра, который содержит такую информацию, как состояние Store, Actions и Getters. Мы можем объединить несколько defineStore
функций в полное хранилище, чтобы лучше управлять и поддерживать состояние приложения.
import {
defineStore } from 'pinia'
const counterStore = defineStore({
id: 'counter',
state: () => ({
count: 0
}),
actions: {
increment() {
this.count++
},
decrement() {
this.count--
}
},
getters: {
doubleCount: (state) => state.count * 2,
},
})
const userStore = defineStore({
id: 'user',
state: () => ({
name: '',
email: ''
}),
actions: {
setName(name) {
this.name = name
},
setEmail(email) {
this.email = email
}
}
})
export default {
counterStore,
userStore
}
В приведенном выше коде мы сначала используем defineStore
функцию для определения counterStore
хранилища с именем , которое содержит состояние счетчика и действия для увеличения и уменьшения значения счетчика. Затем мы используем defineStore
эту функцию для определения userStore
хранилища с именем , которое содержит статус информации о пользователе и действия для изменения имени пользователя и электронной почты. Наконец, counterStore
мы userStore
экспортируем и как объект для использования в других компонентах.
5.2 Пространства имен
В Pinia мы можем использовать пространства имен для организации магазинов. Пространства имен могут группировать несколько Store и объединять их в полное состояние приложения. Пространства имен могут помочь нам лучше управлять и поддерживать состояние приложения, избегая конфликтов состояний и повторяющихся определений.
import {
createPinia } from 'pinia'
import {
counterStore } from './counter'
import {
userStore } from './user'
const pinia = createPinia()
pinia.useStore('counter', counterStore)
pinia.useStore('user', userStore)
export default pinia
В приведенном выше коде мы сначала используем createPinia
функцию для создания экземпляра Pinia, затем используем useStore
функцию для добавления counterStore
и userStore
к экземпляру Pinia и counter
используем user
пространства имен и соответственно. Это означает, что в других компонентах мы this.$pinia.store.counter
можем this.$pinia.store.user
получить доступ к хранилищу счетчиков и хранилищу пользовательской информации через и .
6. Механизм подключаемых модулей Pinia и асинхронная работа
6.1. Вставной механизм
В Pinia мы можем использовать плагины для расширения его функциональности. Плагин может быть простым объектом или объектом, содержащим несколько функций. Мы можем использовать use
функцию для добавления плагинов.
import {
createPinia } from 'pinia'
const pinia = createPinia()
const myPlugin = {
// ...
}
pinia.use(myPlugin)
В приведенном выше коде мы сначала используем createPinia
функцию для создания экземпляра Pinia, а затем используем use
функцию для myPlugin
добавления к экземпляру Pinia.
6.2 Асинхронные операции
В Pinia мы можем использовать асинхронные операции для обработки некоторых данных, которые должны ожидать. Асинхронная операция может быть обещанием или асинхронной функцией. Мы можем использовать await
ключевое слово для ожидания результата асинхронной операции.
import {
defineStore } from 'pinia'
export const useUserStore = defineStore({
id: 'user',
state: () => ({
name: '',
email: ''
}),
actions: {
async fetchUser() {
const response = await fetch('/api/user')
const data = await response.json()
this.name = data.name
this.email = data.email
}
}
})
В приведенном выше коде мы сначала используем defineStore
функцию для определения useUserStore
хранилища с именем, которое содержит статус информации о пользователе и fetchUser
метод . В fetchUser
методе мы сначала используем fetch
функцию для получения данных информации о пользователе, а затем используем await
ключевое слово для ожидания fetch
результата функции и анализируем его в формате JSON. Наконец, мы присваиваем полученные данные состоянию хранилища.