最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3?setup添加name的方法步驟

 更新時(shí)間:2022年11月30日 15:31:45   作者:小滿zs  
如果你在 vue3 開發(fā)中使用了語法的話,對(duì)于組件的name屬性,需要做一番額外的處理,下面這篇文章主要給大家介紹了關(guān)于Vue3?setup添加name的相關(guān)資料,需要的朋友可以參考下

Vue3中name有什么用呢?

1.在遞歸組件的時(shí)候需要定義name

2.配合keep-alive include exclude 可以緩存組件

3.在Vue有報(bào)錯(cuò)或者調(diào)試的時(shí)候可以看到組件的name

Vue3 定義 name

1.自動(dòng)生成

<script setup> 只要在script開啟setup語法糖模式 單文件組件會(huì)自動(dòng)根據(jù)文件名生成對(duì)應(yīng)的 name 選項(xiàng) 例如 Tree.vue 那他的name 就是 Tree 自動(dòng)生成,這樣做有一個(gè)弊端如果想修改name需要修改組件名稱如果有地方import 該組件需要一并修改。

2.在開啟一個(gè)script用來定義name

優(yōu)點(diǎn) 這種方式可以隨意定義name 弊端 一個(gè)單文件組件出現(xiàn)兩個(gè)script 會(huì)讓人感到疑惑。

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

<script lang="ts" setup>
import {ref,reactive } from 'vue'
</script>

<script lang='ts'>
 export default {
    name:"XXX"
 }
</script>

<style lang="less" scoped>

</style>

3.使用第三方插件 unplugin-vue-define-options

安裝方法 npm i unplugin-vue-define-options -D

vite 使用

// vite.config.ts
import DefineOptions from 'unplugin-vue-define-options/vite'
import Vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [Vue(), DefineOptions()],
})

配置tsconfig.json

// tsconfig.json
{
  "compilerOptions": {
    // ...
    "types": ["unplugin-vue-define-options/macros-global" /* ... */]
  }
}

使用方法 通過編譯宏 defineOptions 添加nameinheritAttrs

<script setup lang="ts">
defineOptions({
  name: 'Foo',
  inheritAttrs: false,
})
</script>

4.個(gè)人想法 我想著直接在script 定義name 不好嗎?

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

<script name="xiaoman" lang="ts" setup>
import {ref,reactive } from 'vue'
</script>


<style lang="less" scoped>

</style>

這件事情在Vue社區(qū)也是進(jìn)行了激烈的討論,而尤大也是做出了回復(fù)

大致意思就是:尤大覺得這個(gè)構(gòu)思很好,但是有一些擔(dān)憂,在我們使用組件的時(shí)候需要定義nameinheritAttrs 情況非常罕見,大部分組件庫(kù)的開發(fā)人員可能經(jīng)常會(huì)使用這兩個(gè)東西,但對(duì)于90%的應(yīng)用程序組件來說,這確實(shí)是一組不同的權(quán)衡,并且處理props將會(huì)變得很麻煩,再加上實(shí)現(xiàn)的復(fù)雜性,不確定做這件事是否值得。

不過已經(jīng)有一個(gè)插件實(shí)現(xiàn)該功能 unplugin-vue-setup-extend-plus

我們來復(fù)刻一個(gè)簡(jiǎn)易版 其原理還是加一個(gè)script 只不過開發(fā)人員看不到了這個(gè)script

Vue3 setup 支持 name 插件實(shí)現(xiàn) 思路借鑒上面插件

import type { Plugin } from 'vite'
//@vue/compiler-sfc 這個(gè)插件是處理我們單文件組件的代碼解析
import { compileScript, parse } from '@vue/compiler-sfc'

export default function setupName(): Plugin {
    return {

        name: 'vite:plugin:vue:name',
        //一個(gè) Vite 插件可以額外指定一個(gè) `enforce` 屬性
        //(類似于 webpack 加載器)來調(diào)整它的應(yīng)用順序。`enforce` 的值可以是`pre` 或 `post`
        //加載順序?yàn)?
          //Alias
          //帶有 `enforce: 'pre'` 的用戶插件
          //Vite 核心插件
          //沒有 enforce 值的用戶插件
          //Vite 構(gòu)建用的插件
          //帶有 `enforce: 'post'` 的用戶插件
         //Vite 后置構(gòu)建插件(最小化,manifest,報(bào)告)
        enforce: "pre",
        //transform code參數(shù)就是我們寫的代碼比如vue代碼  id就是路徑例如/src/xx/xx.vue
        transform(code, id) {
            //只處理vue結(jié)尾的文件
            if (/.vue$/.test(id)) {
                let { descriptor } = parse(code)
                //通過compileScript 處理script 返回result
                  //attrs: { name: 'xm', lang: 'ts', setup: true },
                  //lang: 'ts',
                  //setup: true,
                const result = compileScript(descriptor, { id })
                //attrs 此時(shí)就是一個(gè)對(duì)象
                const name = result.attrs.name 
                const lang = result.attrs.lang
                const inheritAttrs = result.attrs.inheritAttrs
                //寫入script
                const template = `
                <script ${lang ? `lang=${lang}` :  ''}>
                 export default {
                    ${name ? `name:"${name}",`  : ''}
                    ${inheritAttrs ? `inheritAttrs: ${inheritAttrs !== 'false'},` : ''}
                 }
                </script>
                `;
                //最后拼接上這段代碼 也就是我們加的script這一段 返回code
                code += template;
               // console.log(code)
            }

            return code
        }
    }
}

然后在vite config ts 引入我們寫好的插件

Tree.vue 子組件

<template>
    <div v-for="item in data">
        {{ item.name }}
        <xm v-if="item?.children?.length" :data='item?.children'></xm>
    </div>
</template>

<script name='xm' lang="ts" setup>
import { ref, reactive } from 'vue'
defineProps<{
    data: any[]
}>()
</script>

App.vue 父組件

<template>
    <TreeVue :data="data"></TreeVue>
</template>

<script lang="ts" setup>
import TreeVue from './components/Tree.vue';
const data = [
    {
        name: "1",
        children: [
            {
                name: "1-1",
                children: [
                    {
                        name: "1-1-1"
                    }
                ]
            }
        ]
    }
]
</script>

組件成功遞歸出來

總結(jié)

到此這篇關(guān)于Vue3 setup添加name的文章就介紹到這了,更多相關(guān)Vue3 setup添加name內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談vue 多個(gè)變量同時(shí)賦相同值互相影響

    淺談vue 多個(gè)變量同時(shí)賦相同值互相影響

    這篇文章主要介紹了淺談vue 多個(gè)變量同時(shí)賦相同值互相影響,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vue分頁組件table-pagebar使用實(shí)例解析

    vue分頁組件table-pagebar使用實(shí)例解析

    這篇文章主要為大家詳細(xì)解析了vue分頁組件table-pagebar使用實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Vue組件通信之父?jìng)髯优c子傳父詳細(xì)講解

    Vue組件通信之父?jìng)髯优c子傳父詳細(xì)講解

    這篇文章主要介紹了React中父子組件通信詳解,在父組件中,為子組件添加屬性數(shù)據(jù),即可實(shí)現(xiàn)父組件向子組件通信,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-10-10
  • 圖文詳解vue框架安裝步驟

    圖文詳解vue框架安裝步驟

    我們?cè)诒酒獌?nèi)容里給大家整理了關(guān)于vue框架安裝的步驟以及需要注意的地方,有需要的朋友們學(xué)習(xí)下。
    2019-02-02
  • Vue引入Stylus知識(shí)點(diǎn)總結(jié)

    Vue引入Stylus知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給各位整理的是一篇關(guān)于Vue引入Stylus知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2020-01-01
  • vue實(shí)現(xiàn)tab路由切換組件的方法實(shí)例

    vue實(shí)現(xiàn)tab路由切換組件的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)tab路由切換組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Vue中mixins的使用方法詳解

    Vue中mixins的使用方法詳解

    mixins是一種分發(fā) Vue 組件中可復(fù)用功能的使用方式,它是一個(gè) js 對(duì)象,包含我們組件script中的任意功能選項(xiàng),下面就跟隨小編一起來看看它的具體使用吧
    2024-03-03
  • vue2中使用echarts實(shí)現(xiàn)中國(guó)地圖、在中國(guó)地圖上標(biāo)注坐標(biāo)散點(diǎn)圖的操作代碼

    vue2中使用echarts實(shí)現(xiàn)中國(guó)地圖、在中國(guó)地圖上標(biāo)注坐標(biāo)散點(diǎn)圖的操作代碼

    這篇文章主要介紹了vue2中使用echarts實(shí)現(xiàn)中國(guó)地圖、在中國(guó)地圖上標(biāo)注坐標(biāo)散點(diǎn)圖,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • vue項(xiàng)目打包清除console.log的四種方法總結(jié)

    vue項(xiàng)目打包清除console.log的四種方法總結(jié)

    大家在項(xiàng)目開發(fā)的時(shí)候,需要看看一些后端接口返回的結(jié)果,會(huì)多次使用console.log項(xiàng)目開發(fā)完成打包的時(shí)候,發(fā)現(xiàn)控制臺(tái)一堆的console.log,非常頭疼,下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目打包清除console.log的四種方法,需要的朋友可以參考下
    2023-04-04
  • vue中Vue.set()的使用以及對(duì)其進(jìn)行深入解析

    vue中Vue.set()的使用以及對(duì)其進(jìn)行深入解析

    vue不允許在已經(jīng)創(chuàng)建的實(shí)例上動(dòng)態(tài)添加新的根級(jí)響應(yīng)式屬性,不過可以使用Vue.set()方法將響應(yīng)式屬性添加到嵌套的對(duì)象上,下面這篇文章主要給大家介紹了關(guān)于vue中Vue.set()的使用以及對(duì)其進(jìn)行深入解析的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評(píng)論

余姚市| 秀山| 额敏县| 柘荣县| 潞西市| 道真| 中方县| 修武县| 阳朔县| 松潘县| 鲁山县| 若尔盖县| 乐平市| 绵阳市| 吉木萨尔县| 金阳县| 肃南| 南平市| 新邵县| 鹤壁市| 许昌市| 永福县| 蒙阴县| 子洲县| 江阴市| 远安县| 凯里市| 女性| 安徽省| 兴和县| 卫辉市| 潞城市| 金湖县| 瑞昌市| 五峰| 滦南县| 阳原县| 武安市| 呈贡县| 丽水市| 曲沃县|