在 Nuxt 3 中使用该目录时,composables/ 目录将自动导入,将 Vue 可组合项(Hooks)自动导入到您的应用程序中,即不需要在其它地方 import;所以一些通用的 hooks,只需放入该目录下即可;

新建 src/composables 目录,新建 src/composables/useFoo.ts 文件
命名导出

  1. // ~/composables/useFoo.ts
  2. export const useFoo = () => {
  3. return useState('foo', () => 'bar')
  4. }

默认导出

  1. // ~/composables/useFoo.ts 或 ~/composables/use-foo.ts
  2. export default function () {
  3. return useState('foo', () => 'bar')
  4. }

在 src/pages/index.vue 中使用

  1. <template>
  2. <div>
  3. {{ foo }}
  4. </div>
  5. </template>
  6. <script setup>
  7. const foo = useFoo()
  8. </script>

自定义 hooks

新建 src/composables 目录,新建 src/composables/useFoo.ts 文件

  1. import i18n from '@/lang'
  2. export default function useTitle() {
  3. const $t = i18n.global.t
  4. function setTitle() {
  5. document.title = $t('fields.title')
  6. }
  7. return { setTitle }
  8. }

在 src/pages/index.vue 中使用

  1. const title = useTitle()
  2. onMounted(() => title.setTitle())

自动导入规则

Nuxt 仅扫描composables目录顶层的文件,例如:

  1. composables
  2. | - index.ts // 扫描
  3. | - useFoo.ts // 扫描
  4. | - nested
  5. | --- utils.ts // 不扫描

只有composables/index.ts和composables/useFoo.ts会被自动扫描导入。
为了让被嵌套的模块也可以自动导入,可以重新导出它们(推荐)或配置扫描器:

重新导出(推荐)

从composables/index.ts文件中重新导出你需要的composables。

  1. // composables/index.ts
  2. // 在 index.ts 中导入 utils 组合方法,同时导出该方法
  3. export { utils } from './nested/utils.ts'

配置扫描器

在 nuxt.config.ts 中配置扫描 composables 文件夹内的嵌套目录

  1. // nuxt.config.ts
  2. export default defineNuxtConfig({
  3. imports: {
  4. dirs: [
  5. // 扫描顶层模块
  6. 'composables',
  7. // 或用一个特定的名称和文件扩展名嵌套一级深度的扫描模块
  8. 'composables/*/index.{ts,js,mjs,mts}',
  9. // 或扫描指定目录下的所有模块
  10. 'composables/**'
  11. ]
  12. }
  13. })

nuxt 内置 hooks

:::info 以下 hooks 为内部集成的 API,不需要手动 import 导入即可使用 :::


useAppConfig

访问项目中的 Nuxt 配置

  1. const appConfig = useAppConfig()
  2. console.log(appConfig)

useAsyncData

在页面、组件和插件中,您可以使用 useAsyncData 来访问异步返回的数据;

  1. const { data, pending, error, refresh } = await useAsyncData(
  2. 'mountains',
  3. () => $fetch('https://api.nuxtjs.dev/mountains')
  4. )

useFetch

顾名思义,这就是一个 fetch 请求;在页面、组件或者插件中可以使用 useFetch 获取任意URL资源。
useFetch是对 useAsyncData 包装,自动生成 key 同时推断响应类型,用起来更简单。
image.png

  1. const param1 = ref('value1')
  2. const { data, pending, error, refresh } = await useFetch('https://api.nuxtjs.dev/mountains',{
  3. query: { param1, param2: 'value2' }
  4. })

useCookie

在页面、组件和插件中,可以使用 useCookie 一个 SSR 友好的 hooks 来读取和写入 cookie。

  1. <template>
  2. <div>
  3. <h1> Counter: {{ counter || '-' }}</h1>
  4. <button @click="counter = null">
  5. reset
  6. </button>
  7. <button @click="counter--">
  8. -
  9. </button>
  10. <button @click="counter++">
  11. +
  12. </button>
  13. </div>
  14. </template>
  15. <script setup>
  16. const counter = useCookie('counter')
  17. counter.value = counter.value || Math.round(Math.random() * 1000)
  18. </script>

useHead

Nuxt 提供 useHead 可组合项来添加和自定义 Nuxt 应用程序各个页面的头部属性。

  1. useHead(meta: MaybeComputedRef<MetaObject>): void
  2. interface MetaObject {
  3. title?: string
  4. titleTemplate?: string | ((title?: string) => string)
  5. base?: Base
  6. link?: Link[]
  7. meta?: Meta[]
  8. style?: Style[]
  9. script?: Script[]
  10. noscript?: Noscript[]
  11. htmlAttrs?: HtmlAttributes
  12. bodyAttrs?: BodyAttributes
  13. }
  1. <script setup lang="ts">
  2. useHead({
  3. title: 'My App',
  4. meta: [
  5. { name: 'description', content: 'My amazing site.' }
  6. ],
  7. bodyAttrs: {
  8. class: 'test'
  9. },
  10. script: [ { innerHTML: 'console.log(\'Hello world\')' } ]
  11. })
  12. </script>

useRoute

useRoute 是一个在实际项目开发中使用较多的 hooks,主要返回当前路由的一些数据;并且必须在 setup 函数、插件或路由中间件中调用。

  1. <script setup>
  2. const route = useRoute()
  3. const { data: mountain } = await useFetch(`https://api.nuxtjs.dev/mountains/${route.params.slug}`)
  4. </script>
  5. <template>
  6. <div>
  7. <h1>{{ mountain.title }}</h1>
  8. <p>{{ mountain.description }}</p>
  9. </div>
  10. </template>

useRouter

useRouter 返回路由器的实例,并且必须在设置函数、插件或路由中间件中调用。

  1. const router = useRouter();
  2. router.back();
  3. router.forward();
  4. router.go();
  5. router.push({ path: "/home" });
  6. router.replace({ hash: "#bio" });