Бэкенды хранилища
useIndexedDB
Promise-based доступ ключ-значение к object store IndexedDB. Store создаётся автоматически, если не существует.
function useIndexedDB<T>(
dbName: string,
storeName: string,
onError?: (err: StorageError) => void,
options?: UseIndexedDBOptions,
): UseIndexedDBReturn<T>Опции
indexes
IDBIndexDefinition[]
Вторичные индексы, создаваемые на store, каждый вида { name, keyPath, unique?, multiEntry? } — создаются один раз, при первом открытии store (изменения схемы требуют увеличения version).
version
number · по умолчанию: 1
Версия базы данных IndexedDB. Увеличивайте её при каждом изменении indexes — IndexedDB перезапускает upgrade (и, соответственно, применяет новые/изменённые индексы) только когда запрошенная версия выше сохранённой.
Методы
get
(key: IDBValidKey) => Promise<T | null>
Прочитать значение по ключу.
set
(key: IDBValidKey, value: T) => Promise<void>
Записать значение.
delete
(key: IDBValidKey) => Promise<void>
Удалить ключ.
keys
() => Promise<IDBValidKey[]>
Все ключи в store.
getAll
() => Promise<T[]>
Все значения.
clear
() => Promise<void>
Удалить всё содержимое store.
count
() => Promise<number>
Количество записей.
transaction
<R>(fn: (store: IDBObjectStore) => IDBRequest<R>) => Promise<R>
Сырая IDB-транзакция для всего, что не покрывает обёртка выше.
getByIndex
(indexName: string, value: IDBValidKey) => Promise<T | null>
Прочитать первое значение, чей вторичный индекс (объявленный через опцию indexes) совпадает с value.
getAllByIndex
(indexName: string, value: IDBValidKey) => Promise<T[]>
Прочитать все значения, чей вторичный индекс совпадает с value.
Пример
import { useIndexedDB } from 'vue-storage-kit'
interface Person {
id: number
email: string
data: ArrayBuffer
}
const idb = useIndexedDB<Person>('my-db', 'people', (err) => console.error(err), {
indexes: [{ name: 'by-email', keyPath: 'email', unique: true }],
version: 1,
})
await idb.set(1, { id: 1, email: 'ada@example.com', data: buffer })
const person = await idb.get(1)
console.log(await idb.count())
// Запрос по вторичному индексу вместо первичного ключа
const byEmail = await idb.getByIndex('by-email', 'ada@example.com')
// Сырая транзакция
await idb.transaction((store) => store.put({ id: 2, email: 'b@example.com', data: buffer2 }, 2))
await idb.delete(1)
await idb.clear()useIDBRef
Реактивный Ref, который читает и пишет одиночный ключ IndexedDB. Полезен, когда нужен тот же реактивный API, что и у useStorage, но на базе IndexedDB.
useIDBRef<T>(
dbName: string,
storeName: string,
key: IDBValidKey,
defaultValue: T,
): { value: Ref<T>; isReady: Ref<boolean>; error: Ref<StorageError | null> }import { useIDBRef } from 'vue-storage-kit'
const { value: draft, isReady } = useIDBRef('editor-db', 'drafts', 'post-42', '')
// Как только isReady.value === true, draft отражает сохранённое значение
draft.value = 'Hello, world!' // автоматически пишется обратно в IDBuseCookie
Реактивный Ref на базе document.cookie. Присваивание рефу устанавливает cookie. По умолчанию включена JSON-сериализация с поддержкой Date, Map, Set.
Импортированный напрямую из vue-storage-kit, он клиентский (чтения при SSR возвращают defaultValue, поскольку на сервере нет document). Внутри Nuxt-приложения с подключённым модулем vue-storage-kit/nuxt автоимпортированные вызовы useCookie разрешаются вместо этого в SSR-совместимую версию — та же сигнатура, но на базе запроса/ответа H3 на сервере. См. Модуль Nuxt.
useCookie<T>(name: string, options: CookieOptions<T>): Ref<T>Опции
defaultValue
T
Значение, возвращаемое, когда cookie отсутствует.
expires
Date | number
Срок действия как Date или число дней.
path
string · по умолчанию: '/'
Путь cookie.
domain
string
Домен cookie.
secure
boolean
Добавить флаг Secure.
sameSite
'strict' | 'lax' | 'none'
Атрибут SameSite.
httpOnly
boolean
Только для SSR — передаётся в H3 setCookie; игнорируется браузерами, поскольку document.cookie в принципе не позволяет установить этот флаг из клиентского JS. При указании на этом базовом, клиентском useCookie (то есть вне SSR-контекста Nuxt) теперь выводится console.warn в dev-режиме вместо тихого игнорирования — по-настоящему учесть флаг может только SSR-совместимая замена useCookie из модуля Nuxt.
serializer
Serializer<T> · по умолчанию: JSON
Кастомный сериализатор.
Примеры
Сессионная cookie (истекает при закрытии браузера):
const consent = useCookie('cookie-consent', { defaultValue: false })
consent.value = trueПостоянная cookie — 30 дней:
const locale = useCookie('locale', {
defaultValue: 'en',
expires: 30,
sameSite: 'lax',
})Nuxt SSR — один и тот же API работает на сервере и клиенте:
<script setup lang="ts">
// При подключённом модуле vue-storage-kit/nuxt этот автоимпорт разрешается
// в SSR-совместимый useCookie — читает/пишет через H3 на сервере.
const token = useCookie('auth-token', {
defaultValue: '',
secure: true,
httpOnly: true, // учитывается на сервере через H3 setCookie
sameSite: 'strict',
})
</script>