nuxt logo

ドキュメント翻訳(非公式)

useCookie

useCookieは、SSRに対応したクッキーの読み書きを行うためのコンポーザブルです。

使用方法

ページ、コンポーネント、プラグイン内で、useCookieを使用してSSRに対応した方法でクッキーの読み書きを行うことができます。

const cookie = useCookie(name, options)

useCookieNuxtコンテキストでのみ動作します。

返される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) => TdecodeURIComponent + destr.クッキーの値をデコードするカスタム関数。クッキーの値は限られた文字セットを持ち(単純な文字列でなければならない)、この関数を使用して以前にエンコードされたクッキーの値をJavaScriptの文字列や他のオブジェクトにデコードできます。
注意: この関数からエラーがスローされた場合、元のデコードされていないクッキーの値がクッキーの値として返されます。
encode(value: T) => stringJSON.stringify + encodeURIComponentクッキーの値をエンコードするカスタム関数。クッキーの値は限られた文字セットを持ち(単純な文字列でなければならない)、この関数を使用して値をクッキーの値に適した文字列にエンコードできます。
default() => T | Ref<T>undefinedクッキーが存在しない場合にデフォルト値を返す関数。この関数はRefを返すこともできます。
watchboolean | 'shallow'true変更を監視してクッキーを更新するかどうか。trueは深い監視、'shallow'は浅い監視(トップレベルのプロパティのみのデータ変更)、falseは無効化。
注意: クッキーが変更されたときはrefreshCookieuseCookieの値を手動で更新してください。
readonlybooleanfalsetrueの場合、クッキーへの書き込みを無効にします。
maxAgenumberundefinedクッキーの最大年齢(秒単位)、つまりMax-Age Set-Cookie属性の値。指定された数値は切り捨てられて整数に変換されます。デフォルトでは最大年齢は設定されていません。
expiresDateundefinedクッキーの有効期限。デフォルトでは有効期限は設定されていません。ほとんどのクライアントはこれを「非永続的クッキー」と見なし、Webブラウザアプリケーションを終了するなどの条件で削除します。
注意: クッキーストレージモデル仕様では、expiresmaxAgeの両方が設定されている場合、maxAgeが優先されるとされていますが、すべてのクライアントがこれに従うわけではないため、両方が設定されている場合は同じ日時を指すべきです!
expiresmaxAgeのどちらも設定されていない場合、クッキーはセッションのみで、ユーザーがブラウザを閉じたときに削除されます。
httpOnlybooleanfalseHttpOnly属性を設定します。
注意: これをtrueに設定すると、準拠したクライアントはクライアント側のJavaScriptがdocument.cookieでクッキーを見ることを許可しないため、注意が必要です。
securebooleanfalseSecure Set-Cookie属性を設定します。
注意: これをtrueに設定すると、準拠したクライアントはブラウザがHTTPS接続を持たない場合、将来サーバーにクッキーを返送しないため、注意が必要です。これによりハイドレーションエラーが発生する可能性があります。
partitionedbooleanfalsePartitioned Set-Cookie属性を設定します。
注意: これはまだ完全に標準化されていない属性であり、将来的に変更される可能性があります。
これにより、多くのクライアントはこの属性を理解するまで無視する可能性があります。
詳細は提案で確認できます。
domainstringundefinedDomain Set-Cookie属性を設定します。デフォルトではドメインは設定されておらず、ほとんどのクライアントはクッキーを現在のドメインにのみ適用すると見なします。
pathstring'/'Path Set-Cookie属性を設定します。デフォルトでは、パスは"デフォルトパス"と見なされます。
sameSiteboolean | stringundefinedSameSite Set-Cookie属性を設定します。
- trueSameSite属性をStrictに設定し、厳格な同一サイトの強制を行います。
- falseSameSite属性を設定しません。
- '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パッケージからgetCookiesetCookieを使用できます。

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