useCookie
useCookieは、SSRに対応したクッキーの読み書きを行うためのコンポーザブルです。
使用方法
ページ、コンポーネント、プラグイン内で、useCookie
を使用してSSRに対応した方法でクッキーの読み書きを行うことができます。
const cookie = useCookie(name, options)
useCookie
はNuxtコンテキストでのみ動作します。
返されるrefはクッキーの値を自動的にJSONにシリアライズおよびデシリアライズします。
型
Signature
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
: クッキーの名前。
options
: クッキーの動作を制御するオプション。このオブジェクトには以下のプロパティを含めることができます。
ほとんどのオプションはcookieパッケージに直接渡されます。
プロパティ | 型 | デフォルト | 説明 |
---|---|---|---|
decode | (value: string) => T | decodeURIComponent + destr. | クッキーの値をデコードするカスタム関数。クッキーの値は限られた文字セットを持ち(単純な文字列でなければならない)、この関数を使用して以前にエンコードされたクッキーの値をJavaScriptの文字列や他のオブジェクトにデコードできます。 注意: この関数からエラーがスローされた場合、元のデコードされていないクッキーの値がクッキーの値として返されます。 |
encode | (value: T) => string | JSON.stringify + encodeURIComponent | クッキーの値をエンコードするカスタム関数。クッキーの値は限られた文字セットを持ち(単純な文字列でなければならない)、この関数を使用して値をクッキーの値に適した文字列にエンコードできます。 |
default | () => T | Ref<T> | undefined | クッキーが存在しない場合にデフォルト値を返す関数。この関数はRef を返すこともできます。 |
watch | boolean | 'shallow' | true | 変更を監視してクッキーを更新するかどうか。true は深い監視、'shallow' は浅い監視(トップレベルのプロパティのみのデータ変更)、false は無効化。注意: クッキーが変更されたときは refreshCookie でuseCookie の値を手動で更新してください。 |
readonly | boolean | false | true の場合、クッキーへの書き込みを無効にします。 |
maxAge | number | undefined | クッキーの最大年齢(秒単位)、つまりMax-Age Set-Cookie 属性の値。指定された数値は切り捨てられて整数に変換されます。デフォルトでは最大年齢は設定されていません。 |
expires | Date | undefined | クッキーの有効期限。デフォルトでは有効期限は設定されていません。ほとんどのクライアントはこれを「非永続的クッキー」と見なし、Webブラウザアプリケーションを終了するなどの条件で削除します。 注意: クッキーストレージモデル仕様では、 expires とmaxAge の両方が設定されている場合、maxAge が優先されるとされていますが、すべてのクライアントがこれに従うわけではないため、両方が設定されている場合は同じ日時を指すべきです!expires とmaxAge のどちらも設定されていない場合、クッキーはセッションのみで、ユーザーがブラウザを閉じたときに削除されます。 |
httpOnly | boolean | false | HttpOnly属性を設定します。 注意: これを true に設定すると、準拠したクライアントはクライアント側のJavaScriptがdocument.cookie でクッキーを見ることを許可しないため、注意が必要です。 |
secure | boolean | false | Secure Set-Cookie 属性を設定します。注意: これを true に設定すると、準拠したクライアントはブラウザがHTTPS接続を持たない場合、将来サーバーにクッキーを返送しないため、注意が必要です。これによりハイドレーションエラーが発生する可能性があります。 |
partitioned | boolean | false | Partitioned Set-Cookie 属性を設定します。注意: これはまだ完全に標準化されていない属性であり、将来的に変更される可能性があります。 これにより、多くのクライアントはこの属性を理解するまで無視する可能性があります。 詳細は提案で確認できます。 |
domain | string | undefined | Domain Set-Cookie 属性を設定します。デフォルトではドメインは設定されておらず、ほとんどのクライアントはクッキーを現在のドメインにのみ適用すると見なします。 |
path | string | '/' | Path Set-Cookie 属性を設定します。デフォルトでは、パスは"デフォルトパス"と見なされます。 |
sameSite | boolean | string | undefined | SameSite Set-Cookie 属性を設定します。- true はSameSite 属性をStrict に設定し、厳格な同一サイトの強制を行います。- false はSameSite 属性を設定しません。- 'lax' はSameSite 属性をLax に設定し、緩やかな同一サイトの強制を行います。- 'none' はSameSite 属性をNone に設定し、明示的なクロスサイトクッキーを設定します。- 'strict' はSameSite 属性をStrict に設定し、厳格な同一サイトの強制を行います。 |
戻り値
クッキーの値を表すVue Ref<T>
を返します。refを更新するとクッキーも更新されます(readonly
が設定されていない限り)。refはSSRに対応しており、クライアントとサーバーの両方で動作します。
例
基本的な使用法
以下の例では、counter
というクッキーを作成します。クッキーが存在しない場合、最初にランダムな値に設定されます。counter
変数を更新するたびに、クッキーもそれに応じて更新されます。
app.vue
<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>
読み取り専用クッキー
<script setup lang="ts">
const user = useCookie(
'userInfo',
{
default: () => ({ score: -1 }),
watch: false
}
)
if (user.value) {
// 実際の`userInfo`クッキーは更新されません
user.value.score++
}
</script>
<template>
<div>User score: {{ user?.score }}</div>
</template>
書き込み可能なクッキー
<script setup lang="ts">
const list = useCookie(
'list',
{
default: () => [],
watch: 'shallow'
}
)
function add() {
list.value?.push(Math.round(Math.random() * 1000))
// この変更ではlistクッキーは更新されません
}
function save() {
if (list.value) {
// 実際の`list`クッキーは更新されます
list.value = [...list.value]
}
}
</script>
<template>
<div>
<h1>List</h1>
<pre>{{ list }}</pre>
<button @click="add">Add</button>
<button @click="save">Save</button>
</div>
</template>
APIルートでのクッキー
サーバーAPIルートでクッキーを設定するために、h3
パッケージからgetCookie
とsetCookie
を使用できます。
server/api/counter.ts
export default defineEventHandler(event => {
// カウンタークッキーを読み取る
let counter = getCookie(event, 'counter') || 0
// カウンタークッキーを1増やす
setCookie(event, 'counter', ++counter)
// JSONレスポンスを送信
return { counter }
})
サンプルコードの編集とプレビューexamples > advanced > use-cookie
※このページは Nuxt.js 公式ドキュメントの翻訳ページ(非公式)です。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/api/composables/use-cookie