首頁  >  文章  >  web前端  >  Vue3中setup怎麼加name

Vue3中setup怎麼加name

WBOY
WBOY轉載
2023-05-13 09:40:062207瀏覽

    Vue3中name有什麼用呢?

    1.在遞迴元件的時候需要定義name

    2.配合keep-alive include exclude 可以快取元件

    3.在Vue有報錯或是調試的時候可以看到元件的name

    Vue3 定義name

    1.自動產生

    <script setup></script> 只要在script#開啟setup語法糖模式單一檔案元件會自動根據檔案名稱產生對應的 name 選項例如Tree.vue 那他的name#就是Tree 自動生成,這樣做有一個弊端如果想修改name需要修改元件名稱如果有地方import 該元件需要一併修改。

    2.在開啟一個script用來定義name

    優點 這種方式可以隨意定義name 弊端 一個單一檔案元件出現兩個script 會讓人感到疑惑。

    <template>
    <div></div>
    </template>
    
    <script lang="ts" setup>
    import {ref,reactive } from &#39;vue&#39;
    </script>
    
    <script lang=&#39;ts&#39;>
     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 &#39;unplugin-vue-define-options/vite&#39;
    import Vue from &#39;@vitejs/plugin-vue&#39;
    
    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: &#39;Foo&#39;,
      inheritAttrs: false,
    })
    </script>

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

    <template>
    <div></div>
    </template>
    
    <script name="xiaoman" lang="ts" setup>
    import {ref,reactive } from &#39;vue&#39;
    </script>
    
    
    <style lang="less" scoped>
    
    </style>

    這件事情在Vue社區也是進行了激烈的討論,而尤大也是做出了回复

    尤大覺得這個構思很好,但是有一些擔憂,在我們使用元件的時候需要定義nameinheritAttrs 情況非常罕見,大部分元件庫的開發人員可能經常會使用這兩個東西,但對於90%的應用程式組件來說,這確實是一組不同的權衡,並且處理props將會變得很麻煩,再加上實現的複雜性,不確定做這件事是否值得。

    不過已經有一個插件實作該功能unplugin-vue-setup-extend-plus

    我們來復刻一個簡易版其原理還是加一個script 只不過開發人員看不到了這個script

    Vue3 setup 支援name 外掛實作想法借鑒上面外掛程式

    import type { Plugin } from &#39;vite&#39;
    //@vue/compiler-sfc 这个插件是处理我们单文件组件的代码解析
    import { compileScript, parse } from &#39;@vue/compiler-sfc&#39;
    
    export default function setupName(): Plugin {
        return {
    
            name: &#39;vite:plugin:vue:name&#39;,
            //一个 Vite 插件可以额外指定一个 `enforce` 属性
            //(类似于 webpack 加载器)来调整它的应用顺序。`enforce` 的值可以是`pre` 或 `post`
            //加载顺序为
              //Alias
              //带有 `enforce: &#39;pre&#39;` 的用户插件
              //Vite 核心插件
              //没有 enforce 值的用户插件
              //Vite 构建用的插件
              //带有 `enforce: &#39;post&#39;` 的用户插件
             //Vite 后置构建插件(最小化,manifest,报告)
            enforce: "pre",
            //transform code参数就是我们写的代码比如vue代码  id就是路径例如/src/xx/xx.vue
            transform(code, id) {
                //只处理vue结尾的文件
                if (/.vue$/.test(id)) {
                    let { descriptor } = parse(code)
                    //通过compileScript 处理script 返回result
                      //attrs: { name: &#39;xm&#39;, lang: &#39;ts&#39;, setup: true },
                      //lang: &#39;ts&#39;,
                      //setup: true,
                    const result = compileScript(descriptor, { id })
                    //attrs 此时就是一个对象
                    const name = result.attrs.name 
                    const lang = result.attrs.lang
                    const inheritAttrs = result.attrs.inheritAttrs
                    //写入script
                    const template = `
                    <script ${lang ? `lang=${lang}` :  &#39;&#39;}>
                     export default {
                        ${name ? `name:"${name}",`  : &#39;&#39;}
                        ${inheritAttrs ? `inheritAttrs: ${inheritAttrs !== &#39;false&#39;},` : &#39;&#39;}
                     }
                    </script>
                    `;
                    //最后拼接上这段代码 也就是我们加的script这一段 返回code
                    code += template;
                   // console.log(code)
                }
    
                return code
            }
        }
    }

    然後在vite config ts 引入我們寫好的外掛

    Vue3中setup怎麼加name

    Tree.vue 子元件

    <template>
        <div v-for="item in data">
            {{ item.name }}
            <xm v-if="item?.children?.length" :data=&#39;item?.children&#39;></xm>
        </div>
    </template>
    
    <script name=&#39;xm&#39; lang="ts" setup>
    import { ref, reactive } from &#39;vue&#39;
    defineProps<{
        data: any[]
    }>()
    </script>

    #App.vue 父元件

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

    元件成功遞歸出來

    Vue3中setup怎麼加name

    以上是Vue3中setup怎麼加name的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除