Vue3組件注冊的四種常見方式詳解
引言
在 Vue3 的項(xiàng)目開發(fā)中,組件化是一個(gè)核心特性,它可以讓我們將頁面拆分成多個(gè)小的、可復(fù)用的組件,從而提高代碼的可維護(hù)性和可復(fù)用性。而在使用 Vue 組件之前,我們需要先對其進(jìn)行 “注冊”,這樣 Vue 才能在渲染模板時(shí)找到其對應(yīng)的實(shí)現(xiàn)。本文將詳細(xì)介紹 Vue3 中四種常見的組件注冊方式,希望能幫助你更好地掌握 Vue3 的組件注冊技巧。
方式一:全局注冊
全局注冊是指在項(xiàng)目的入口文件 main.js 或 main.ts 文件中,通過 Vue 提供的 .component() 方法將組件注冊為全局組件。一旦組件被全局注冊,就可以在任何其他 Vue 組件中直接使用,無需手動導(dǎo)入。
import { createApp } from 'vue'
import App from './App.vue'
import MyComponent from './components/MyComponent.vue'
const app = createApp(App)
// 全局注冊組件
app.component('MyComponent', MyComponent)
app.mount('#app')
方式二:局部注冊
局部注冊是指在單個(gè) Vue 組件內(nèi)部使用 import 導(dǎo)入組件并注冊,這種方式注冊的組件只能在當(dāng)前組件中使用。
<template>
<div>
<MyComponent />
</div>
</template>
<script setup>
import MyComponent from './components/MyComponent.vue'
</script>
方式三:插件注冊
插件注冊是利用 Vue 的插件機(jī)制將一組 Vue 組件注冊為全局組件。這種方式適合于一次性注冊多個(gè)組件,提高代碼的復(fù)用性和可維護(hù)性。
MyPlugin.js 中通過 install 方法會向 Vue 應(yīng)用程序中注冊 MyButton,MyInput 自定義組件:
// MyPlugin.js
// 組件集合對象 <組件名稱,組件定義對象>
const components: Record<string, object> = {
MyButton,
MyInput
}
export default {
// 在 Vue 應(yīng)用中注冊組件
install(app: App) {
Object.keys(components).forEach((name) => {
app.component(name, components[name])
})
},
}
在 main.js 中,通過 app.use(MyPlugin) 將插件注冊到應(yīng)用中,之后就可以在任何地方使用插件中的組件。
import { createApp } from 'vue'
import App from './App.vue'
import MyPlugin from './MyPlugin'
const app = createApp(App)
// 插件注冊
app.use(MyPlugin)
app.mount('#app')
方式四:unplugin-vue-components 自動導(dǎo)入組件
unplugin-vue-components 是一個(gè)用于自動導(dǎo)入 Vue 組件的插件,它可以自動掃描項(xiàng)目中使用的組件,并在需要的地方自動導(dǎo)入,減少了手動 import 的工作量。同時(shí),它還支持第三方組件庫的自動導(dǎo)入,像 Element Plus、Ant Design Vue、Vant 等流行組件庫都能輕松適配,并且對 TypeScript 有良好的支持,能自動生成類型聲明文件,確保在 TypeScript 項(xiàng)目中類型檢查的準(zhǔn)確性。
GitHub 項(xiàng)目地址:https://github.com/unplugin/unplugin-vue-components
使用示例
安裝 unplugin-vue-components 插件:
# npm 安裝 npm install unplugin-auto-import --save-dev # pnpm 安裝 pnpm add -D unplugin-vue-components # yarn 安裝 yarn add unplugin-vue-components -D
在 Vite 項(xiàng)目 vite.config.ts 中添加 unplugin-vue-components 配置:
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import Components from 'unplugin-vue-components/vite';
export default defineConfig({
plugins: [
vue(),
// 自動導(dǎo)入組件
Components({
dirs: ['src/components'],
}),
],
});
在完成 unplugin-vue-components 的配置后,就可以在項(xiàng)目中直接使用組件,無需手動導(dǎo)入:
<template>
<div>
<MyButton />
</div>
</template>
<script setup>
// 無需手動導(dǎo)入MyButton組件
</script>
如果配置了第三方組件庫的解析器,例如 ElementPlus,也可以直接使用 ElementPlus 的組件:
<template>
<div>
<el-button type="primary">Element Plus按鈕</el-button>
</div>
</template>
<script setup>
// 無需手動導(dǎo)入ElButton組件
</script>
這樣,unplugin-vue-components插件會自動識別并導(dǎo)入項(xiàng)目中使用的組件,大大簡化了組件的使用過程。
配置項(xiàng)說明
unplugin-vue-components 插件的配置項(xiàng)如下:
dirs:組件掃描目錄,指定需要掃描的組件目錄路徑(相對路徑),默認(rèn)值為['src/components'],也可以同時(shí)指定多個(gè)目錄:
// 掃描多個(gè)目錄 dirs: ['src/components', 'src/views/shared']
extensions:文件擴(kuò)展名匹配,指定需要識別的組件文件擴(kuò)展名,默認(rèn)僅支持.vue文件。如果項(xiàng)目中使用了其他類型的組件文件,可以在這里進(jìn)行配置:
// 同時(shí)支持 .vue、.jsx 和 .tsx 文件 extensions: ['vue', 'jsx', 'tsx']
globs:文件匹配模式,使用 Glob 模式精確匹配組件文件,指定后將忽略dirs、extensions和directoryAsNamespace選項(xiàng):
// 僅掃描 src/components 目錄下的 .vue 文件 globs: ['src/components/*.vue'] // 使用以 ! 開頭的負(fù)匹配模式排除某些組件不被注冊 globs: ['src/components/**/*.vue', '!src/components/**/*.test.vue']
deep:遞歸掃描子目錄。默認(rèn)值為true,插件會遞歸地搜索指定目錄下的所有子目錄;如果設(shè)置為false,則只搜索指定目錄的一級文件:
// 關(guān)閉子目錄掃描 deep: false
resolvers:配置第三方組件庫組件的自動導(dǎo)入解析器。當(dāng)需要自動導(dǎo)入第三方組件庫的組件時(shí),就需要使用這個(gè)選項(xiàng):
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
resolvers: [
ElementPlusResolver(), // 自動導(dǎo)入 ElementPlus 組件
]
常用的第三方組件庫解析器有:
- Element Plus:
ElementPlusResolver - Ant Design Vue:
AntDesignVueResolver - Vant:
VantResolver - Vuetify:
VuetifyResolver - Headless UI:
HeadlessUiResolver dts:是否生成全局聲明文件components.d.ts,默認(rèn)在安裝 TypeScript 時(shí)啟用。如果項(xiàng)目使用了 TypeScript,生成的類型聲明文件可以幫助編輯器提供更準(zhǔn)確的代碼提示和類型檢查。
// 關(guān)閉類型聲明文件生成 dts: false, // 自定義類型聲明文件路徑 dts: 'src/types/components.d.ts',
directoryAsNamespace:將目錄結(jié)構(gòu)作為組件命名空間前綴。
// 啟用命名空間 directoryAsNamespace: true // 組件路徑:src/components/admin/Button.vue // 使用方式:<AdminButton />
collapseSamePrefixes:是否折疊目錄和組件的相同前綴以避免命名重復(fù)(區(qū)分大小寫)。
// 目錄結(jié)構(gòu):src/components/admin/AdminButton.vue // 折疊后:<AdminButton /> 而非 <AdminAdminButton /> collapseSamePrefixes: true
globalNamespaces:指定應(yīng)忽略的目錄前綴作為全局命名空間。
// 組件路徑:src/components/admin/Button.vue // 全局命名空間:['admin'] // 使用方式:<Button /> 而非 <AdminButton /> globalNamespaces: ['admin']
directives:是否自動導(dǎo)入指令,Vue 3默認(rèn)啟用,Vue 2默認(rèn)禁用(需Babel支持)。
// 啟用Vue 2指令支持(需安裝@babel/parser) directives: true
importPathTransform:自定義導(dǎo)入路徑的轉(zhuǎn)換函數(shù)。
// 添加自定義前綴
importPathTransform: (path) => `@/components/${path}`
allowOverrides:是否允許同名組件覆蓋,默認(rèn)禁止。
// 允許同名組件覆蓋 allowOverrides: true
include:匹配需要處理的文件。支持正則表達(dá)式匹配。
include: [/\.vue$/, /\.vue\?vue/, /\.vue\.[tj]sx?\?vue/],
exclude:排除不需要處理的文件。支持正則表達(dá)式匹配。
exclude: [/[\\/]node_modules[\\/]/, /[\\/]\.git[\\/]/, /[\\/]\.nuxt[\\/]/]
excludeNames:排除特定名稱的組件,用于處理插件無法自動檢測的沖突。
// 排除所有以Async開頭的組件 excludeNames: [/^Async.+/]
version:指定項(xiàng)目的 Vue 版本,未指定時(shí)自動檢測。
// 明確指定Vue 3版本 version: 3
types:提供庫中(全局注冊)的組件類型。
// 為Element Plus組件提供類型支持
types: [{ from: 'element-plus', names: ['ElButton', 'ElInput'] }]
到此這篇關(guān)于Vue3組件注冊的四種常見方式詳解的文章就介紹到這了,更多相關(guān)Vue3組件注冊方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Vue + Axios實(shí)現(xiàn)全局Loading自動顯示關(guān)閉效果
在vue項(xiàng)目中,我們通常會使用Axios來與后臺進(jìn)行數(shù)據(jù)交互,而當(dāng)我們發(fā)起請求時(shí),常常需要在頁面上顯示一個(gè)加載框(Loading),然后等數(shù)據(jù)返回后自動將其隱藏,本文介紹了基于Vue + Axios實(shí)現(xiàn)全局Loading自動顯示關(guān)閉效果,需要的朋友可以參考下2024-03-03
element el-table表格的二次封裝實(shí)現(xiàn)(附表格高度自適應(yīng))
這篇文章主要介紹了element el-table表格的二次封裝實(shí)現(xiàn)(附表格高度自適應(yīng)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
前端elementUI?select選擇器實(shí)現(xiàn)遠(yuǎn)程搜索
這篇文章主要為大家介紹了前端使用elementUI?select選擇器實(shí)現(xiàn)遠(yuǎn)程搜索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
詳解給Vue2路由導(dǎo)航鉤子和axios攔截器做個(gè)封裝
本篇文章主要介紹了詳解給Vue2路由導(dǎo)航鉤子和axios攔截器做個(gè)封裝,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
vue 實(shí)現(xiàn)把路由單獨(dú)分離出來
這篇文章主要介紹了vue 實(shí)現(xiàn)把路由單獨(dú)分離出來,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08

