【Nuxt3】目录中components文件夹的用法

简言

在Nuxt3中,components文件夹和vue文件夹用处一样,都是放置vue公共组件的地方。只不过由于Nuxt3中components文件内的组件自动导入机制,用法些许不同。

components

components/ 目录是你放置所有 Vue 组件的地方。
Nuxt 会自动导入该目录中的所有组件(以及您可能使用的任何模块注册的组件)。
假如目录:

| components/
--| AppHeader.vue
--| AppFooter.vue

则可以这样使用,默认不需要导入:

<template>
  <div>
    <AppHeader />
    <NuxtPage />
    <AppFooter />
  </div>
</template>

组件名称

自动导入的组件默认名称为:它自身名到compontes的路径名 + 文件名,且重复的部分将被删除。
例如:
【Nuxt3】目录中components文件夹的用法_第1张图片
那么 :
【Nuxt3】目录中components文件夹的用法_第2张图片
如果你不想带路径,仅根据组件名称怎么办?可以在nuxt.config.ts配置文件配置:

export default defineNuxtConfig({
  components: [
    {
      path: '~/components',
+     pathPrefix: false,
    },
  ],
});

动态组件

现在nuxt3不是有自动导入机制嘛,你没导入组件怎么使用动态组件嘞?
很简单:

  • 从#components导入即可
  • 使用resolveComponent(str)vue的辅助函数,按名称手动解析已注册的组件,为了能从正确的组件上下文进行解析,resolveComponent() 必须在setup() 或渲染函数内调用。
    【Nuxt3】目录中components文件夹的用法_第3张图片

延迟加载

要动态导入组件(也称为延迟加载组件),您只需将 Lazy 前缀添加到组件的名称中。如果组件不总是需要,这特别有用。
通过使用 Lazy 前缀和v-if搭配,您可以将组件代码的加载延迟到正确的时机,这有助于优化 JavaScript 包的大小。
这是因为nuxt3看到组件名前面有Lazy,所以按vue3懒加载组件执行。所以创建组件时名称前避免带Lazy字符串。

    <LazyTabBaseTab />

客户端组件和服务器组件

如果一个组件只在客户端渲染,您可以在组件名后添加 .client 后缀。例如:

| components/
--| Comments.client.vue

此功能仅适用于 Nuxt 的自动导入和 #components 导入。从实际路径显式导入这些组件不会将它们转换为仅客户端组件。
.client 组件仅在挂载后才会渲染。要在 onMounted() 的回调中访问渲染的模板,请在 onMounted() 钩子的回调中添加 await nextTick()。

服务器端组件允许在客户端应用程序中进行单独组件的服务器渲染。即使您正在生成静态站点,也可以在 Nuxt 中使用服务器端组件。这使得可以构建复杂的站点,混合动态组件、服务器渲染的 HTML 甚至静态标记的块。
**即使在服务器端渲染上,服务器端组件也可以单独使用或与客户端组件配对使用。**例如.server + .client 组件是组件的两个“半部分”,可以在服务器端和客户端分别使用高级用例来分别实现组件。

| components/
--| Comments.client.vue
--| Comments.server.vue

<template>
  <div>
    
    <Comments />
  div>
template>

自定义扩展自动导入组件目录

默认情况下,只会扫描 ~/components 目录。如果您想添加其他目录,或更改在该目录的子文件夹中如何扫描组件,您可以将其他目录添加到配置中:

export default defineNuxtConfig({
  components: [
    // ~/calendar-module/components/event/Update.vue => 
    { path: '~/calendar-module/components' },

    // ~/user-module/components/account/UserDeleteDialog.vue => 
    { path: '~/user-module/components', pathPrefix: false },

    // ~/components/special-components/Btn.vue => 
    { path: '~/components/special-components', prefix: 'Special' },

    // 如果您想要覆盖 `~/components` 的子目录,请确保它是最后一个。
    //
    // ~/components/Btn.vue => 
    // ~/components/base/Btn.vue => 
    '~/components'
  ]
})

使用库的组件

使用自动摇树和组件注册创建 Vue 组件库非常简单 ✨
您可以使用 components:dirs 钩子来扩展目录列表,而无需在您的 Nuxt 模块中要求用户配置。
假设有以下目录结构:

| node_modules/
---| awesome-ui/
------| components/
---------| Alert.vue
---------| Button.vue
------| nuxt.js
| pages/
---| index.vue
| nuxt.config.js

然后在 awesome-ui/nuxt.js 中,您可以使用 components:dirs 钩子:

import { defineNuxtModule, createResolver } from '@nuxt/kit'

export default defineNuxtModule({
  hooks: {
    'components:dirs': (dirs) => {
      const { resolve } = createResolver(import.meta.url)
      // 将 ./components 目录添加到列表中
      dirs.push({
        path: resolve('./components'),
        prefix: 'awesome'
      })
    }
  }
})

就是这样!现在在您的项目中,您可以将您的 UI 库作为 Nuxt 模块在 nuxt.config 文件中导入:

export default defineNuxtConfig({
  modules: ['awesome-ui/nuxt']
})

… 并在我们的 pages/index.vue 中直接使用模块组件(以 awesome- 为前缀):

<template>
  <div>
    我的 <AwesomeButton>UI 按钮AwesomeButton><awesome-alert>这是一个提示!awesome-alert>
  div>
template>

它将仅在使用时自动导入组件,并在 node_modules/awesome-ui/components/ 中更新组件时支持 HMR。

结语

本篇主要将了nuxt3自导导入下的components文件夹如何使用。
你可以和向往常一样自己导入然后使用。

你可能感兴趣的:(Nuxt3,vue.js,前端,javascript)