composables
Использование
Способ 1: именованный экспорт
export const useFoo = () => {
return useState('foo', () => 'bar')
}
Способ 2: экспорт по умолчанию
// Будет доступен как useFoo() (camelCase от имени файла без расширения)
export default function () {
return useState('foo', () => 'bar')
}
Использование: композабл можно использовать в файлах .js, .ts и .vue без явного импорта
<script setup lang="ts">
const foo = useFoo()
</script>
<template>
<div>
{{ foo }}
</div>
</template>
app/composables/ в Nuxt не добавляет реактивности сама по себе. Реактивность в композаблах обеспечивается механизмами Composition API Vue (ref, reactive). Реактивный код не ограничен границами app/composables/ — его можно использовать в любом месте приложения.Типы
Nuxt автоматически генерирует файл .nuxt/imports.d.ts с объявлениями типов.
Типы появятся после запуска nuxt prepare, nuxt dev или nuxt build.
Cannot find name 'useBar'.Примеры
Вложенные композаблы
Один композабл можно вызывать из другого через автоимпорт:
export const useFoo = () => {
const nuxtApp = useNuxtApp()
const bar = useBar()
}
Доступ к инъекциям плагинов
Из композаблов доступны инъекции плагинов:
export const useHello = () => {
const nuxtApp = useNuxtApp()
return nuxtApp.$hello
}
Как сканируются файлы
Nuxt сканирует только файлы на верхнем уровне директории app/composables/:
-| composables/
---| index.ts // сканируется
---| useFoo.ts // сканируется
---| nested/
-----| utils.ts // не сканируется
Импорты ищутся только в app/composables/index.ts и app/composables/useFoo.ts.
Чтобы автоимпорт работал для вложенных модулей, можно реэкспортировать их (рекомендуется) или настроить сканирование вложенных директорий:
Пример: реэкспорт из app/composables/index.ts:
// Включает автоимпорт для этого экспорта
export { utils } from './nested/utils.ts'
Пример: сканирование вложенных директорий в app/composables/:
export default defineNuxtConfig({
imports: {
dirs: [
// Сканировать композаблы верхнего уровня
'~/composables',
// или композаблы на один уровень вглубь с заданным именем и расширением
'~/composables/*/index.{ts,js,mjs,mts}',
// или все композаблы в директории
'~/composables/**',
],
},
})