Vue3?在<script?setup>里設(shè)置組件name屬性的方法
Vue3 如何在<script setup>里設(shè)置組件name屬性
一、Vue組件中 name 的用處
一般情況,在 <script setup>
語(yǔ)法糖下,大多數(shù)人往往將其忽略,畢竟確實(shí)很少用得上 name 屬性,但如果需要用到時(shí),卻為怎么聲明使用犯起了難,即使 Vue 在默認(rèn)情況下會(huì)將文件名定義為 name 屬性,但文件名是可以重復(fù)的,如出現(xiàn)一大堆 index.vue
,閣下又將如何應(yīng)對(duì)呢。
我們先來(lái)看看在什么場(chǎng)景下需要使用到 name 屬性,或則說(shuō) name 屬性具體能夠做什么,有什么用。
<keep-alive>
的include
和exclude
屬性根據(jù)組件的 name 進(jìn)行匹配,如果想要條件性地被keep-alive
緩存,就必須顯式聲明一個(gè) name 屬性。
<keep-alive :include="['a', 'b']" :exclude=['c', 'd']> <component :is="view" /> </keep-alive>
- 組件遞歸引用自己,在 Vue 組件中只需要引用的組件名稱與當(dāng)前組件 name 屬性保持一直,組件是可以自己引用自己的,這點(diǎn)在編寫類似于 Tree 樹(shù)形組件時(shí)十分有用。需要注意的一點(diǎn)是,為避免死循環(huán)遞歸,請(qǐng)帶上條件語(yǔ)句。
<template> <my-component v-if="遞歸終止條件" /> </template> <script lang="ts"> export default { name: "my-component" } </script>
- 在開(kāi)發(fā)者工具調(diào)試工具中,是以 name 屬性標(biāo)志組件的,在搜索功能上通過(guò) name 名稱能夠快速定位組件方便調(diào)試,同時(shí)合理清晰的組件名稱來(lái)講,對(duì)于報(bào)錯(cuò)信息也更容易精準(zhǔn)定位。圖中的 index 是依據(jù)文件名稱自動(dòng)推導(dǎo),在不聲明 name 屬性的情況下,容易發(fā)生重復(fù)現(xiàn)象。
二、難看但實(shí)用的方法
其實(shí)原理很簡(jiǎn)單,既然 <script setup>
語(yǔ)法糖里不支持聲明 name 屬性,那就繞一下,Vue 允許同時(shí)包含一個(gè) <script setup>
和一個(gè) <script>
快,那么把 <script setup>
上做不來(lái)的事情給 <script>
來(lái)做不就行了。
但這個(gè)寫法也有一個(gè)很明顯的特點(diǎn),那就是丑,對(duì)于強(qiáng)迫癥來(lái)說(shuō)完全不能接受,就為了聲明 name 屬性需要額外寫多一個(gè)塊,這顯然是不合理的。
<script lang="ts"> export default { name: "my-component" } </script> <script lang="ts" setup> /* 業(yè)務(wù)代碼 */ </script>
三、使用第三方插件支持
對(duì)于喜歡這種寫法的人來(lái)說(shuō),可以說(shuō)是福音,市面上也有很多第三方的組件、插件也存在這種寫法。但這種方法顯然也不是最好的,一是需要額外的打插件操作,二是與 Vue 版本依賴關(guān)系大。
第三方插件有很多,在這里推薦一個(gè)比較好的插件 unplugin-vue-setup-extend-plus
。
安裝插件
yarn add unplugin-vue-setup-extend-plus pnpm add unplugin-vue-setup-extend-plus
插件基本配置
// vite.config.ts import vueSetupExtend from 'unplugin-vue-setup-extend-plus/vite' export default defineConfig({ plugins: [ vueSetupExtend() ], }) // vue.config.js module.exports = defineConfig({ configureWebpack: { plugins: [require('unplugin-vue-setup-extend-plus/webpack').default()], } })
插件基本使用
<template> </template> <script lang="ts" setup name="my-component"> /* 業(yè)務(wù)代碼 */ </script>
四、Vue官方解決方法
使用官方的好處就是不用擔(dān)心其兼容性等問(wèn)題,Vue官方的解決辦法有點(diǎn)特殊,對(duì)于 Vue3.3 版本之前與之后分為兩個(gè)方法,先來(lái)說(shuō)說(shuō)說(shuō) Vue3.3 版本之前需要怎么做。
4.1 Vue3.3版本之前
在 Vue 未正式解決這個(gè)問(wèn)題之前,需要安裝一個(gè)官方插件來(lái)支持額外的語(yǔ)法宏在<script setup>
上。
安裝插件
使用包管理工具,安裝一個(gè)名為 unplugin-vue-define-options
的插件。
yarn add unplugin-vue-define-options -D pnpm add unplugin-vue-define-options -D
對(duì)于 Volar 的語(yǔ)法檢測(cè),需要再額外安裝一個(gè) @vue-macros/volar
插件,當(dāng)然如果你不使用 Volar 的話,那可以選擇無(wú)視。
yarn add @vue-macros/volar -D pnpm add @vue-macros/volar -D
插件基本配置
需要注意的是,vite 與 vuecli 配置方式不同,請(qǐng)根據(jù)項(xiàng)目各自選擇。
// vite.config.ts import DefineOptions from 'unplugin-vue-define-options/vite' export default defineConfig({ plugins: [DefineOptions()], }) // vue.config.js module.exports = defineConfig({ configureWebpack: { plugins: [require('unplugin-vue-define-options/webpack')()], } })
TypeScript 支持配置
// tsconfig.json { "compilerOptions": { "types": ["unplugin-vue-define-options/macros-global"] } }
對(duì)于語(yǔ)法檢測(cè),如果出現(xiàn)報(bào)錯(cuò)的情況,使用 Volar 的可以安裝 @vue-macros/volar
插件并配置相關(guān)代碼。
// tsconfig.json { "vueCompilerOptions": { "target": 3, // 或 2.7 用于 Vue 2 "plugins": [ "@vue-macros/volar/define-options" // ...更多功能 ] } }
或則更直接在 .eslintrc.js 里加上下述配置,直接忽略錯(cuò)誤,當(dāng)然只是語(yǔ)法檢測(cè)層面,程序?qū)嶋H不受影響。
module.exports = { globals: { defineOptions: "readonly" } }
使用 defineOptions 編譯宏
與 defineProps
編譯宏類似,此時(shí)我們多了一個(gè)可以設(shè)置 name 屬性的編譯宏,只需要傳入?yún)?shù)即可配置心心念念的 name 屬性。
<script lang="ts" setup> defineOptions({ name: "my-component" }) /* 業(yè)務(wù)代碼 */ </script>
4.2 Vue3.3版本之后
在 Vue3.3 版本更新之后,對(duì)于這個(gè)問(wèn)題的解決方案就簡(jiǎn)單多了,defineOptions
編譯宏以內(nèi)置支持,不需要再去額外安裝其他插件,直接使用即可。
defineOptions
能做的不只是聲明 name 屬性,其功能能做到更多,如是否允許組件attribute
透?jìng)餍袨榈?inheritAttrs
屬性。
五、后記
對(duì)于在 <script setup>
中聲明 name 的問(wèn)題,其實(shí)老外早就想到且引起了許多的討論,尤雨溪也多次下場(chǎng),也有人提出以 <script setup name="xxx">
作為解決方案,但最終采用的是 defineOptions
編譯宏,并在 Vue3.3 版本之后內(nèi)置支持。
對(duì)于使用者來(lái)說(shuō),name 屬性可能有點(diǎn)微不足道,但就是為了實(shí)現(xiàn)這么一個(gè)小小的功能,背后的實(shí)現(xiàn)卻充斥著各位開(kāi)發(fā)者的努力?? 。
https://github.com/vuejs/core/issues/5218
https://github.com/vuejs/rfcs/discussions/430#discussioncomment-2333745
參考資料??
官方手冊(cè):
到此這篇關(guān)于Vue3 如何在<script setup>里設(shè)置組件name屬性的文章就介紹到這了,更多相關(guān)Vue3 <script setup>設(shè)置組件name屬性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue中的百度地圖定位BMap.GeolocationControl的用法
BMap.GeolocationControl?是百度地圖API中的一個(gè)類,用于添加地理定位控件到地圖上,以便用戶可以通過(guò)該控件獲取自己的當(dāng)前位置,本文給大家介紹Vue中的百度地圖定位BMap.GeolocationControl的用法,感興趣的朋友跟隨小編一起看看吧2023-10-10vue+iview 實(shí)現(xiàn)可編輯表格的示例代碼
這篇文章主要介紹了vue+iview 實(shí)現(xiàn)可編輯表格的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10vue如何解決watch和methods值執(zhí)行順序問(wèn)題
這篇文章主要介紹了vue如何解決watch和methods值執(zhí)行順序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08vue-cli腳手架搭建的項(xiàng)目去除eslint驗(yàn)證的方法
今天小編就為大家分享一篇vue-cli腳手架搭建的項(xiàng)目去除eslint驗(yàn)證的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09Vue+ElementUI table實(shí)現(xiàn)表格分頁(yè)
這篇文章主要為大家詳細(xì)介紹了Vue+ElementUI table實(shí)現(xiàn)表格分頁(yè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12vue3.0引入百度地圖并標(biāo)記點(diǎn)的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue3.0引入百度地圖并標(biāo)記點(diǎn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08