nuxt logo

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

composables

composables/ ディレクトリを使用して、Vue composables をアプリケーションに自動インポートします。

使用法

方法 1: 名前付きエクスポートを使用

composables/useFoo.ts
export const useFoo = () => {
  return useState('foo', () => 'bar')
}

方法 2: デフォルトエクスポートを使用

composables/use-foo.ts or composables/useFoo.ts
// useFoo() として利用可能になります(拡張子を除いたファイル名のキャメルケース)
export default function () {
  return useState('foo', () => 'bar')
}

使用法: 自動インポートされた composable を .js.ts.vue ファイルで使用できます

app.vue
<script setup lang="ts">
const foo = useFoo()
</script>

<template>
  <div>
    {{ foo }}
  </div>
</template>

Nuxt の composables/ ディレクトリは、コードに追加のリアクティビティ機能を提供しません。代わりに、composables 内のリアクティビティは、ref や reactive などの Vue の Composition API メカニズムを使用して実現されます。リアクティブなコードは composables/ ディレクトリの境界に限定されないことに注意してください。アプリケーション内で必要な場所でリアクティビティ機能を自由に使用できます。

こちらも参照 guide > concepts > auto-imports
サンプルコードの編集とプレビューexamples > features > auto-imports

内部では、Nuxt は .nuxt/imports.d.ts ファイルを自動生成して型を宣言します。

Nuxt に型を生成させるためには、nuxt preparenuxt dev、または nuxt build を実行する必要があることに注意してください。

開発サーバーを実行せずに composable を作成すると、TypeScript は Cannot find name 'useBar'. のようなエラーを投げます。

ネストされた Composables

自動インポートを使用して、別の composable 内で composable を使用できます:

composables/test.ts
export const useFoo = () => {
  const nuxtApp = useNuxtApp()
  const bar = useBar()
}

プラグイン注入へのアクセス

composables から プラグイン注入 にアクセスできます:

composables/test.ts
export const useHello = () => {
  const nuxtApp = useNuxtApp()
  return nuxtApp.$hello
}

ファイルのスキャン方法

Nuxt は composables/ ディレクトリ のトップレベルのファイルのみをスキャンします。例:

Directory Structure
-| composables/
---| index.ts     // スキャンされる
---| useFoo.ts    // スキャンされる
---| nested/
-----| utils.ts   // スキャンされない

composables/index.tscomposables/useFoo.ts のみがインポートのために検索されます。

ネストされたモジュールの自動インポートを機能させるには、それらを再エクスポートする(推奨)か、スキャナーを設定してネストされたディレクトリを含めることができます:

例: 必要な composables を composables/index.ts ファイルから再エクスポートする:

composables/index.ts
// このエクスポートの自動インポートを有効にする
export { utils } from './nested/utils.ts'

例: composables/ フォルダ内のネストされたディレクトリをスキャンする:

nuxt.config.ts
export default defineNuxtConfig({
  imports: {
    dirs: [
      // トップレベルの composables をスキャン
      '~/composables',
      // ... または特定の名前とファイル拡張子でネストされた1レベル深い composables をスキャン
      '~/composables/*/index.{ts,js,mjs,mts}',
      // ... または指定されたディレクトリ内のすべての composables をスキャン
      '~/composables/**'
    ]
  }
})