" />

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

Vue冷門技巧遞歸組件實踐示例詳解

 更新時間:2023年03月06日 10:23:00   作者:JetTsang  
這篇文章主要為大家介紹了Vue冷門技巧遞歸組件實踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

痛點引出

在平時的開發(fā)當中,渲染側(cè)邊欄導(dǎo)航菜單有時會遇到過需要側(cè)邊欄有多層甚至無限層級的問題。此時更優(yōu)雅的方式便是使用遞歸組件

<el-menu>
        <template slot="title">
          <i class="el-icon-location"></i>
          <span>菜單</span>
        </template>
        <el-submenu index="1-1">
          <template slot="title">子菜單</template>
          <el-menu-item index="1-1-1">子菜單選項1</el-menu-item>
          <el-submenu index="1-1-2">  
            <template slot="title">子菜單的子菜單</template>
            <el-menu-item index="1-1-2-1">子菜單的子菜單的選項1</el-menu-item>
          </el-submenu>
        </el-submenu>
      </el-submenu>
</el-menu>

可以看到這部分重復(fù)的代碼可以完全抽離出來做單獨的組件。

<el-submenu>
    <el-menu-item></el-menu-item>
    ...
</el-submenu>

那么問題來了,在一層當中又有重復(fù)的submenu怎么辦?顯然這個層級是需要動態(tài)生成的。比如:

<el-submenu>
    <el-menu-item></el-menu-item>
    ...
    <el-submenu>
        <el-menu-item></el-menu-item>
        ...
        <el-submenu>
            <el-menu-item></el-menu-item>
            ...
            //這里省略很多很多層
        </el-submenu>
    </el-submenu>
</el-submenu>

很明顯,這里需要可以用遞歸(recursive) 的思想來解決, 那么在template模版當中有辦法做這樣的組件嗎?答案當然是可以,template模版語法也是支持遞歸。

源碼中的體現(xiàn)

先找找源碼,我們在src/core/global-api.ts當中找到initExtend函數(shù),這個函數(shù)是initGlobalAPI的一個執(zhí)行步驟,每個組件創(chuàng)建的時候都會去調(diào)用。

可以看到如果命中name,則會給自己的components的配置項當中注冊自己,使得可以在編譯的時候可以識別到自己,從而在template模版語法當中去使用。

組件示例封裝

首先定義數(shù)據(jù)結(jié)構(gòu)能描述這樣的菜單

[
    {
        id: '1',
        title: '父菜單',
        children:[
            {id:'1-1',title:'子選項',children:[]},
            {id:'1-1',title:'子菜單',children:[
                {id:...,title:...,children:...},
                ...
            ]},
            ...
        ]
    }
]
簡單點描述就是
interface item:{
    id: string,
    title: string,
    children: item[] | []
}
item[]

然后開始封裝組件

// RescursiveMenu.vue
<template>
    <el-submenu :index="menuItem.id" v-if="menuItem.children.length">
        <template slot="title">{{ menuItem.title }}</template>
            <template v-for="item in menuItem.children">
                <RecursiveMenu :menuItem="item"/>
            </template>
    </el-submenu>
    <el-menu-item v-else>{{ menuItem.title }}</el-menu-item>
</template>
<script>
export default {
    name:"RecursiveMenu",
    props: {
        menuItem: Object
    }
}
</script>

當然這只是簡單示例demo,后續(xù)根據(jù)業(yè)務(wù)需求相信難不倒各位看官。

使用:

<el-submenu>
    <template v-for="item in menuList.children">
       <RecursiveMenu :menuItem="item" :key="item.id"/>
   </template>
</el-submenu>

小擴展

同樣的,vue也支持jsx/tsx語法 ,使用jsx則需要抽象需要重復(fù)的過程,封裝成渲染函數(shù)來實現(xiàn)遞歸,這里采用整個數(shù)組渲染過程抽象重復(fù),來實現(xiàn)遞歸。

//MyMenu.jsx
export default {
    name:"RecursiveMenu",
    props: {
        menuList: Array,
        dafault:()=>([])
    },
    render(){
        const recursiveRender = (menuList)=>{
                return menuList.map((menuItem)=>{
                        return menuItem.children.length > 0 ? (
                            <elSubmenu index="{menuItem.id}">
                            <div slot="title">{menuItem.title}</div>
                            {recursiveRender(menuItem.children)}
                            </elSubmenu>
                            ):(
                            <elMenuItem key="{menuItem.id}">{ menuItem.title }</elMenuItem>
                        )
                    }
                )
            }
            return (<elMenu>
                {recursiveRender(this.menuList)}
                </elMenu>
            )
    }
}

當然,如果想用jsx復(fù)刻上訴template當中抽象的邏輯,可以寫成這樣:

// RecursiveMenu.jsx
export default {
    name:"RecursiveMenu",
    props: {
        menuItem: Object,
        dafault:()=>({})
    },
    render(){
        const recursiveRender = (menuItem)=>{
            return menuItem.children.length > 0 ? (
                <elSubmenu index="{menuItem.id}">
                    <div slot="title">{menuItem.title}</div>
                    {menuItem.children.map(children=>recursiveRender(children))}
                </elSubmenu>
            ):(
                <elMenuItem key="{menuItem.id}">{ menuItem.title }</elMenuItem>
            )
        }
        return recursiveRender(this.menuItem)
    }
}

總結(jié)

Vue當中實現(xiàn)遞歸渲染,可以使用模版語法和jsx語法。而實現(xiàn)本質(zhì)上是抽象出重復(fù)的邏輯,以及找到遞歸退出點。

以上就是Vue冷門技巧遞歸組件實踐示例詳解的詳細內(nèi)容,更多關(guān)于Vue 遞歸組件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue之keepAlive使用案例詳解

    vue之keepAlive使用案例詳解

    這篇文章主要介紹了vue之keepAlive使用案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Vue3項目中優(yōu)雅實現(xiàn)微信授權(quán)登錄的方法

    Vue3項目中優(yōu)雅實現(xiàn)微信授權(quán)登錄的方法

    用戶在微信端中訪問第三方網(wǎng)頁,可以通過微信網(wǎng)頁授權(quán)機制獲取用戶的基本信息,進而實現(xiàn)所需要的業(yè)務(wù)邏輯,這篇文章主要給大家介紹了關(guān)于Vue3項目中優(yōu)雅實現(xiàn)微信授權(quán)登錄的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Vue.js子組件向父組件通信的方法實例代碼詳解

    Vue.js子組件向父組件通信的方法實例代碼詳解

    這篇文章主要介紹了Vue.js子組件向父組件通信的方法實例代碼,非常不錯,具有一定的參考價借鑒價值,需要的朋友可以參考下
    2018-12-12
  • Vue+elementUI下拉框自定義顏色選擇器方式

    Vue+elementUI下拉框自定義顏色選擇器方式

    這篇文章主要介紹了Vue+elementUI下拉框自定義顏色選擇器方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • vue調(diào)試工具vue-devtools安裝及使用方法

    vue調(diào)試工具vue-devtools安裝及使用方法

    本文主要介紹 vue的調(diào)試工具 vue-devtools 的安裝和使用,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-11-11
  • 在vs code 中如何創(chuàng)建一個自己的 Vue 模板代碼

    在vs code 中如何創(chuàng)建一個自己的 Vue 模板代碼

    這篇文章主要介紹了在vs code 中如何創(chuàng)建一個自己的 Vue 模板代碼,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 淺析Vue中拆分視圖層代碼的5點建議

    淺析Vue中拆分視圖層代碼的5點建議

    這篇文章主要介紹了Vue中拆分視圖層代碼的5點建議,下面就如何進行腳本代碼拆分提供一些思路,有一些可能是很基本的原則,為盡可能完整就放在一起,你并不需要從最開始就采納所有的建議。需要的朋友可以參考下
    2019-08-08
  • vue2.5.2使用http請求獲取靜態(tài)json數(shù)據(jù)的實例代碼

    vue2.5.2使用http請求獲取靜態(tài)json數(shù)據(jù)的實例代碼

    這篇文章主要介紹了vue2.5.2使用http請求獲取靜態(tài)json數(shù)據(jù)的實例代碼,需要的朋友可以參考下
    2018-02-02
  • vue 清空input標簽 中file的值操作

    vue 清空input標簽 中file的值操作

    這篇文章主要介紹了vue 清空input標簽 中file的值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue Spa切換頁面時更改標題的實例代碼

    Vue Spa切換頁面時更改標題的實例代碼

    本篇文章主要介紹了Vue Spa切換頁面時更改標題的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論

四川省| 武定县| 营口市| 井研县| 金湖县| 康平县| 宜良县| 铁岭县| 年辖:市辖区| 贺州市| 绵阳市| 积石山| 新野县| 睢宁县| 枣阳市| 马尔康县| 淮北市| 旺苍县| 德令哈市| 洛扎县| 鄂伦春自治旗| 吴旗县| 宁河县| 桦南县| 唐河县| 于田县| 台湾省| 白山市| 栾川县| 水城县| 白朗县| 洪雅县| 开平市| 囊谦县| 仁寿县| 中江县| 汕头市| 通许县| 安岳县| 应城市| 双城市|