useCookie
Использование
В своих страницах, компонентах и плагинах вы можете использовать useCookie, SSR-совместимый композабл для чтения и записи cookies.
const cookie = useCookie(name, options)
useCookie работает только внутри Nuxt-контекста.Тип
import type { Ref } from 'vue'
import type { CookieParseOptions, CookieSerializeOptions } from 'cookie-es'
export interface CookieOptions<T = any> extends Omit<CookieSerializeOptions & CookieParseOptions, 'decode' | 'encode'> {
decode?(value: string): T
encode?(value: T): string
default?: () => T | Ref<T>
watch?: boolean | 'shallow'
readonly?: boolean
}
export interface CookieRef<T> extends Ref<T> {}
export function useCookie<T = string | null | undefined> (
name: string,
options?: CookieOptions<T>,
): CookieRef<T>
Параметры
name: имя cookie.
options: настройки поведения cookie. Объект может содержать свойства ниже.
Большинство опций передаются в пакет cookie.
| Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
decode | (value: string) => T | decodeURIComponent + destr. | Пользовательская функция декодирования значения cookie. Значение cookie ограничено набором символов (простая строка); функция превращает ранее закодированное значение в строку JavaScript или другой объект. Примечание: при ошибке в функции вернётся исходное не декодированное значение. |
encode | (value: T) => string | JSON.stringify + encodeURIComponent | Пользовательская функция кодирования значения cookie для строки, пригодной для значения cookie. |
default | () => T | Ref<T> | undefined | Фабрика значения по умолчанию, если cookie нет. Может возвращать Ref. |
watch | boolean | 'shallow' | true | Следить за изменениями и обновлять cookie: true — глубокое наблюдение, 'shallow' — только верхний уровень, false — отключить. Примечание: при изменении cookie снаружи обновите значения useCookie вручную через refreshCookie. |
readonly | boolean | false | При true запись в cookie отключена. |
maxAge | number | undefined | Максимальный возраст в секундах (атрибут Max-Age). Число округляется вниз до целого. По умолчанию не задано. |
expires | Date | undefined | Дата истечения. По умолчанию не задана; клиенты обычно считают cookie несессионной и удаляют при выходе из браузера. Примечание: по модели хранения cookie, если заданы и expires, и maxAge, приоритет у maxAge, но не все клиенты так делают — лучше указывать одну и ту же дату/время. Если ни expires, ни maxAge нет, cookie сессионная и удалится при закрытии браузера. |
httpOnly | boolean | false | Атрибут HttpOnly. Примечание: при true клиентский JavaScript не увидит cookie в document.cookie. |
secure | boolean | false | Атрибут Secure. Примечание: при true без HTTPS клиент может не отправлять cookie обратно — возможны ошибки гидратации. |
partitioned | boolean | false | Атрибут Partitioned. Примечание: спецификация ещё не финальна. Многие клиенты могут игнорировать атрибут. Подробнее — в предложении CHIPS. |
domain | string | undefined | Атрибут Domain. По умолчанию домен не задаётся; cookie обычно действует для текущего домена. |
path | string | '/' | Атрибут Path. По умолчанию считается "путь по умолчанию". |
sameSite | boolean | string | undefined | Атрибут SameSite. - true — SameSite=Strict.- false — атрибут не задаётся.- 'lax' — Lax.- 'none' — None (явная кросс-сайтовая cookie).- 'strict' — Strict. |
Возвращаемое значение
Vue-Ref<T> со значением cookie. Изменение ref обновляет cookie (если не задан readonly). Ref совместим с SSR и работает на клиенте и сервере.
Примеры
Базовое использование
В приведённом ниже примере создаётся cookie с именем counter. Если куки не существует, то первоначально ему присваивается случайное значение. Всякий раз, когда мы обновляем переменную counter, cookie будет обновляться соответствующим образом.
<script setup lang="ts">
const counter = useCookie('counter')
counter.value ||= Math.round(Math.random() * 1000)
</script>
<template>
<div>
<h1>Счётчик: {{ counter || '—' }}</h1>
<button @click="counter = null">
сброс
</button>
<button @click="counter--">
-
</button>
<button @click="counter++">
+
</button>
</div>
</template>
Только для чтения
<script setup lang="ts">
const user = useCookie(
'userInfo',
{
default: () => ({ score: -1 }),
watch: false,
},
)
if (user.value) {
// cookie «userInfo» не обновится при этом изменении
user.value.score++
}
</script>
<template>
<div>Счёт пользователя: {{ user?.score }}</div>
</template>
Запись с поверхностным наблюдением (watch: 'shallow')
<script setup lang="ts">
const list = useCookie(
'list',
{
default: () => [],
watch: 'shallow',
},
)
function add () {
list.value?.push(Math.round(Math.random() * 1000))
// список в cookie при этом не обновится
}
function save () {
// обновится именно cookie `list`
list.value &&= [...list.value]
}
</script>
<template>
<div>
<h1>Список</h1>
<pre>{{ list }}</pre>
<button @click="add">
Добавить
</button>
<button @click="save">
Сохранить
</button>
</div>
</template>
Куки в серверных маршрутах API
Вы можете использовать getCookie и setCookie из пакета h3 для установки cookies в маршрутах API сервера.
export default defineEventHandler((event) => {
// Считываем cookie counter
let counter = getCookie(event, 'counter') || 0
// Увеличиваем counter cookie на 1
setCookie(event, 'counter', ++counter)
// Отправляем ответ в формате JSON
return { counter }
})