透過 100 多個提示的集合來學習 Nuxt!

composables

使用 composables/ 目錄來自動匯入您的 Vue composables 到您的應用程式中。

用法

方法 1: 使用具名匯出

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

方法 2: 使用預設匯出

composables/use-foo.ts 或 composables/useFoo.ts
// It will be available as useFoo() (camelCase of file name without extension)
export default function () {
  return useState('foo', () => 'bar')
}

用法: 您現在可以在 .js.ts.vue 檔案中使用自動匯入的 composable

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

<template>
  <div>
    {{ foo }}
  </div>
</template>
Nuxt 中的 composables/ 目錄不會為您的程式碼提供任何額外的響應式功能。相反地,composables 內的任何響應式都是使用 Vue 的 Composition API 機制來實現的,例如 ref 和 reactive。請注意,響應式程式碼也不限於 composables/ 目錄的範圍。您可以自由地在應用程式中任何需要的地方使用響應式功能。
請在 文件 > 指南 > 概念 > 自動匯入 中閱讀更多資訊。
文件 > 範例 > 功能 > 自動匯入 中閱讀和編輯即時範例。

型別

在幕後,Nuxt 會自動產生 .nuxt/imports.d.ts 檔案來宣告型別。

請注意,您必須執行 nuxi preparenuxi devnuxi build,以便讓 Nuxt 產生型別。

如果您在沒有執行開發伺服器的情況下建立 composable,TypeScript 將會拋出錯誤,例如 找不到名稱 '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/ 目錄頂層的檔案,例如:

目錄結構
-| composables/
---| index.ts     // scanned
---| useFoo.ts    // scanned
---| nested/
-----| utils.ts   // not scanned

只會搜尋 composables/index.tscomposables/useFoo.ts 以進行匯入。

為了讓巢狀模組的自動匯入正常運作,您可以重新匯出它們(推薦),或設定掃描器以包含巢狀目錄

範例:composables/index.ts 檔案重新匯出您需要的 composables

composables/index.ts
// Enables auto import for this export
export { utils } from './nested/utils.ts'

範例: 掃描 composables/ 資料夾內的巢狀目錄

nuxt.config.ts
export default 
defineNuxtConfig
({
imports
: {
dirs
: [
// Scan top-level modules 'composables', // ... or scan modules nested one level deep with a specific name and file extension 'composables/*/index.{ts,js,mjs,mts}', // ... or scan all modules within given directory 'composables/**' ] } })