useCookie
В своих страницах, компонентах и плагинах вы можете использовать useCookie, SSR-совместимый композабл для чтения и записи cookies.
const cookie = useCookie(name, options)
useCookie работает только внутри Nuxt-контекста.useCookie автоматически сериализует и десериализует значение cookie в JSON.Пример
В приведенном ниже примере создается cookie с именем counter. Если куки не существует, то первоначально ему присваивается случайное значение. Всякий раз, когда мы обновляем переменную counter, cookie будет обновляться соответствующим образом.
<script setup lang="ts">
const counter = useCookie('counter')
counter.value = counter.value || Math.round(Math.random() * 1000)
</script>
<template>
<div>
<h1>Counter: {{ counter || '-' }}</h1>
<button @click="counter = null">reset</button>
<button @click="counter--">-</button>
<button @click="counter++">+</button>
</div>
</template>
useCookie вручную, когда cookies изменились, используя refreshCookie.Параметры
Данный композабл принимает несколько опций, которые позволяют изменять поведение cookie.
Большинство опций будут напрямую переданы в пакет cookie.
maxAge / expires
Используйте эти параметры для установки срока действия cookie.
maxAge: Определяет number (в секундах), которое будет значением для атрибута Max-Age Set-Cookie.
Указанное число будет преобразовано в целое число путем округления вниз. По умолчанию maxAge не задается.
expires: Определяет объект Date в качестве значения для атрибута Expires Set-Cookie.
По умолчанию срок действия не установлен. Большинство клиентов (браузеров) будут считать это «непостоянным cookie» и удалят его при определенном условии, например, при выходе из приложения веб-браузера.
expires, и maxAge, то приоритет имеет maxAge, но не все клиенты могут подчиниться этому, поэтому если заданы оба параметра, то они должны указывать на одну и ту же дату и время!expires и maxAge не установлено, cookie будет только сессионным и удалится, когда пользователь закроет браузер.httpOnly
Определяет boolean значение для атрибута HttpOnly Set-Cookie. Если значение истинно, атрибут HttpOnly устанавливается, в противном случае - нет. По умолчанию атрибут HttpOnly не установлен.
true, так как некоторые клиенты не позволят JavaScript на стороне клиента видеть cookie в document.cookie.secure
Определяет boolean значение для атрибута Secure Set-Cookie. Если значение истинно, атрибут Secure устанавливается, в противном случае - нет. По умолчанию атрибут Secure не установлен.
true, так как некоторые клиенты не будут отправлять cookie обратно на сервер в будущем, если браузер не имеет HTTPS-соединения. Это может привести к ошибкам гидратации.partitioned
Определяет boolean значение для атрибута Partitioned Set-Cookie. Если значение истинно, атрибут Partitioned устанавливается, в противном случае - нет. По умолчанию атрибут Partitioned не установлен.
domain
Определяет значение для атрибута Domain Set-Cookie. По умолчанию домен не задается, и большинство клиентов будут считать, что cookie применяется только к текущему домену.
path
Определяет значение для атрибута Path Set-Cookie. По умолчанию путь считается "default path".
sameSite
Определяет boolean или string значение для атрибута SameSite Set-Cookie.
trueустановит для атрибутаSameSiteзначениеStrictдля строгого соблюдения same-site.falseне будет устанавливать атрибутSameSite.'lax'установит атрибутSameSiteв значениеLaxдля нестрогого соблюдения правил на одном сайте.'none'установит атрибутSameSiteвNoneдля явного межсайтового cookie.'strict'установит для атрибутаSameSiteзначениеStrictдля строгого соблюдения same-site.
Более подробную информацию о различных уровнях исполнения можно найти в спецификации.
encode
Определяет функцию, которая будет использоваться для кодирования значения cookie. Поскольку значение cookie имеет ограниченный набор символов (и должно быть простой строкой), эта функция может быть использована для кодирования значения в строку, подходящую для значения cookie.
По умолчанию используется кодировщик JSON.stringify + encodeURIComponent.
decode
Определяет функцию, которая будет использоваться для декодирования значения cookie. Поскольку значение cookie имеет ограниченный набор символов (и должно быть простой строкой), эта функция может быть использована для декодирования ранее закодированного значения cookie в строку JavaScript или другой объект.
По умолчанию используется декодер decodeURIComponent + destr.
default
Определяет функцию, которая возвращает значение cookie по умолчанию. Функция также может возвращать Ref.
readonly
Позволяет получить доступ к значению cookie без возможности его установки.
watch
Определяет boolean или string значение для слежения за данными cookie ref.
true- Будет следить за изменениями данных cookie ref и их вложенных свойств (по умолчанию).shallow- Будет следить за изменениями данных cookie ref только для свойств верхнего уровня.false- Не будет следить за изменениями данных cookie ref.
useCookie вручную, когда cookies изменились, используя refreshCookie.Пример 1:
<script setup lang="ts">
const user = useCookie(
'userInfo',
{
default: () => ({ score: -1 }),
watch: false
}
)
if (user.value && user.value !== null) {
user.value.score++; // userInfo cookie не обновится при этом изменении
}
</script>
<template>
<div>User score: {{ user?.score }}</div>
</template>
Пример 2:
<script setup lang="ts">
const list = useCookie(
'list',
{
default: () => [],
watch: 'shallow'
}
)
function add() {
list.value?.push(Math.round(Math.random() * 1000))
// list cookie не обновится с этим изменением
}
function save() {
if (list.value && list.value !== null) {
list.value = [...list.value]
// list cookie обновится при помощи такого изменения
}
}
</script>
<template>
<div>
<h1>Список</h1>
<pre>{{ list }}</pre>
<button @click="add">Добавить</button>
<button @click="save">Сохранить</button>
</div>
</template>
Cookies в маршрутах 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 }
})