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

Vue實(shí)現(xiàn)遞歸組件的思路與示例代碼

 更新時(shí)間:2022年09月06日 14:35:18   作者:byte_麻雀.  
以簡(jiǎn)單的樹(shù)形組件為案例,實(shí)現(xiàn)在組件中遞歸組件,下面這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)遞歸組件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在我們開(kāi)發(fā)過(guò)程中,為了提高開(kāi)發(fā)效率,降低開(kāi)發(fā)難度,我們會(huì)直接使用組件庫(kù)來(lái)實(shí)現(xiàn),同時(shí)也衍生出了很多優(yōu)秀的組件庫(kù),如:餓了么、螞蟻、Iview、vant等等。但是有時(shí)這些組件庫(kù)提供給我們的組件不滿足我們的需求或者定制組件時(shí)成本太高,那么我們就要手動(dòng)實(shí)現(xiàn)了。

一、遞歸組件是什么?

字面理解為層層遞進(jìn)最后歸并到一起,它的特點(diǎn)就是層級(jí)分明。

例如餓了么組件庫(kù)的樹(shù)組件就是一個(gè)遞歸。

二、Vue實(shí)現(xiàn)遞歸的核心思路

1、循環(huán)出一級(jí)類(lèi)別

2、判斷如果有多級(jí),再調(diào)用自身。

三、代碼示例

1.父級(jí)

代碼如下(示例):

<template>
  <div>
    <!-- 遞歸組件 -->
    <Recursion :list="list" />  list為獲取數(shù)據(jù),傳入子頁(yè)面
  </div>
</template>

<script>
import Recursion from "./recursion.vue";

export default {
  name: "index-Recursion",
  components: {
    Recursion,
  },
};
</script>

2.子級(jí)

代碼如下(示例):

<template>
  <div>
    <div class="item">
      <div>
          <ul>
            <li v-for="(l, id) of list" :key="id">
              {{ l.name }}
              <ul style="padding-left: 20px" v-if="l.chidren"> // 核心代碼1
                <li>
                    <index-chird :list="l.chidren" /> // 核心代碼2
                </li>
              </ul>
            </li>
          </ul>
        </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "index-chird", // 自身組件
  props: {
    list: Array,
  },
  data() {
    return {
      list: [],
    };
  },

  watch: {
    list(newData) {
      this.list = newData;
    },
  },
  
};
</script>

<style  scoped>
.item {
  margin: 0 auto;
}
</style>

此處使用監(jiān)聽(tīng)器監(jiān)聽(tīng)數(shù)據(jù)變化,如果正常發(fā)請(qǐng)求傳遞數(shù)據(jù)不需要監(jiān)聽(tīng),如果報(bào)出沒(méi)有拿到數(shù)據(jù)的錯(cuò)誤可使用監(jiān)聽(tīng)器。

3、實(shí)現(xiàn)效果

補(bǔ)充:遞歸組件的應(yīng)用場(chǎng)景

除了上述的樹(shù)形視圖外,評(píng)論也是一個(gè)不錯(cuò)的應(yīng)用場(chǎng)景,比如網(wǎng)易新聞的評(píng)論回復(fù)功能。或者一個(gè)包含父任務(wù)和多級(jí)子任務(wù)的todolist,總之,遞歸組件適合那些在UI上有父子關(guān)系的場(chǎng)景。

寫(xiě)一個(gè)遞歸組件

其實(shí),有一點(diǎn)也是在實(shí)現(xiàn)遞歸組件要注意的,就是要防止無(wú)限遞歸,造成調(diào)用棧溢出。上面說(shuō)的子子孫孫,無(wú)窮盡也,說(shuō)說(shuō)可以,可是瀏覽器受不了啊。這就要根據(jù)實(shí)際場(chǎng)景來(lái)分析遞歸的終止條件。接下來(lái),我們來(lái)寫(xiě)一個(gè)遞歸組件。

上面的demo實(shí)現(xiàn)了一個(gè)模擬dom事件冒泡的操作,當(dāng)點(diǎn)擊中心圓時(shí),事件逐級(jí)傳遞,然后改變div的顏色,直到冒泡到最頂層。這里根據(jù)設(shè)置圓的數(shù)量進(jìn)行遞歸,遞歸的終止條件是直到數(shù)量減到1:

<template>
...
    <colorful-circle 
         v-if="count > 1" // 控制遞歸條件
         :count="count - 1" // 每向下一層,count減1
         @colorChange="handleColor" 
    ></colorful-circle>
...
</template>

遞歸組件在事件監(jiān)聽(tīng)上也是一個(gè)有意思的地方,你可以一層一層接力,直到將事件冒泡到最頂層。代碼片段如下:

<template>
...
    <colorful-circle 
         v-if="count > 1" 
         :count="count - 1"
         @colorChange="handleColor" // 監(jiān)聽(tīng)子colorful-circle組件發(fā)出的事件
    ></colorful-circle>
...
</template>
 
<script>
name: 'colorful-circle',
...
methods: {
...
    handleColor(c) {
      this.color = Color(c).darkenByAmount( .05 ); // 在本層組件改變顏色
      setTimeout(() => {
        this.$emit('colorChange', this.color); // 把事件再冒泡到上一層組件
      },100)
    },
}
...
</script>

總結(jié)

很簡(jiǎn)單的一個(gè)demo,重點(diǎn)是我們是否了解Vue每個(gè)組件定義的name的真正用途是什么。每個(gè)組件的name值其實(shí)也是為了幫助我們實(shí)現(xiàn)遞歸的。

代碼邏輯也很簡(jiǎn)單,重點(diǎn)在我的子組件。但父組件傳過(guò)來(lái)的樹(shù)形數(shù)據(jù)結(jié)構(gòu)到子組件后,我們需要拿到數(shù)據(jù)并做遍歷,然后再下一行加入核心邏輯:if 發(fā)現(xiàn)我們有子數(shù)據(jù),那么我們直接調(diào)用自身組件,也就是直接使用name值做組件聲明。最關(guān)鍵的是要把子數(shù)據(jù)結(jié)構(gòu)再傳入我們自身組件,那么我們就成功的實(shí)現(xiàn)了數(shù)據(jù)的層層遍歷。

當(dāng)然,這塊兒的子數(shù)據(jù)結(jié)構(gòu)字段我這里叫chirden,一般企業(yè)開(kāi)發(fā)是后臺(tái)給我們的,他們也可以叫A,叫B,我們需要根據(jù)自己的數(shù)據(jù)字段情況,去做相應(yīng)的修改。

到此這篇關(guān)于Vue實(shí)現(xiàn)遞歸組件的文章就介紹到這了,更多相關(guān)Vue實(shí)現(xiàn)遞歸組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue?cesium加載點(diǎn)與定位到指定位置的實(shí)現(xiàn)方法

    vue?cesium加載點(diǎn)與定位到指定位置的實(shí)現(xiàn)方法

    Cesium是一個(gè)用于創(chuàng)建高性能、跨平臺(tái)的3D地球和地圖的開(kāi)源JavaScript庫(kù),它提供了許多功能,包括地理空間數(shù)據(jù)可視化、地理定位和地圖導(dǎo)航等,這篇文章主要介紹了vue?cesium加載點(diǎn)與定位到指定位置,需要的朋友可以參考下
    2024-03-03
  • 一篇文章帶你搞懂VUE基礎(chǔ)知識(shí)

    一篇文章帶你搞懂VUE基礎(chǔ)知識(shí)

    這篇文章主要介紹了vue 組件基礎(chǔ)知識(shí)的相關(guān)資料,幫助大家更好的理解和使用vue的組件,感興趣的朋友可以了解下
    2021-11-11
  • Vue.js系列之項(xiàng)目搭建(1)

    Vue.js系列之項(xiàng)目搭建(1)

    今天要講講Vue2.0了。最近將公司App3.0用vue2.0構(gòu)建了一個(gè)web版,因?yàn)槭堑谝淮问褂胿ue,而且一開(kāi)始使用的時(shí)候2.0出來(lái)一個(gè)月不到,很多坑都是自己去踩的,現(xiàn)在項(xiàng)目要上線了,所以記錄一些過(guò)程
    2017-01-01
  • Vue 2閱讀理解之initRender與callHook組件詳解

    Vue 2閱讀理解之initRender與callHook組件詳解

    這篇文章主要為大家介紹了Vue 2閱讀理解之initRender與callHook組件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • vue項(xiàng)目element?UI?版本升級(jí)過(guò)程遇到的問(wèn)題及解決方案

    vue項(xiàng)目element?UI?版本升級(jí)過(guò)程遇到的問(wèn)題及解決方案

    這篇文章主要介紹了vue項(xiàng)目element?UI?版本升級(jí)過(guò)程遇到的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Vue.js中NaiveUI組件文字漸變的實(shí)現(xiàn)

    Vue.js中NaiveUI組件文字漸變的實(shí)現(xiàn)

    這篇文章主要介紹了Vue.js中NaiveUI組件文字漸變的實(shí)現(xiàn),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Vue的v-model的幾種修飾符.lazy,.number和.trim的用法說(shuō)明

    Vue的v-model的幾種修飾符.lazy,.number和.trim的用法說(shuō)明

    這篇文章主要介紹了Vue的v-model的幾種修飾符.lazy,.number和.trim的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • vue yaml代碼編輯器組件問(wèn)題

    vue yaml代碼編輯器組件問(wèn)題

    這篇文章主要介紹了vue yaml代碼編輯器組件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 基于elementUI豎向表格、和并列的案例

    基于elementUI豎向表格、和并列的案例

    這篇文章主要介紹了基于elementUI豎向表格、和并列的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • Vue上傳組件vue Simple Uploader的用法示例

    Vue上傳組件vue Simple Uploader的用法示例

    本篇文章主要介紹了Vue上傳組件vue Simple Uploader的用法示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-08-08

最新評(píng)論

建宁县| 巫山县| 昌平区| 铜川市| 紫阳县| 筠连县| 秭归县| 肃北| 咸丰县| 温泉县| 青州市| 乌苏市| 阜宁县| 甘泉县| 乌恰县| 土默特左旗| 望都县| 郎溪县| 邓州市| 慈利县| 荆州市| 石台县| 六安市| 普兰店市| 东源县| 于都县| 抚顺县| 宁城县| 香格里拉县| 姜堰市| 苍南县| 富平县| 阜阳市| 新绛县| 三台县| 南平市| 阿图什市| 武强县| 漯河市| 灵台县| 莱州市|