1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        快速實現(xiàn)一個簡單可復(fù)用可擴展的Vue樹組件

        共 3351字,需瀏覽 7分鐘

         ·

        2020-11-28 03:19

        來源 |?https://wintc.top/article/13

        大概因為平時工作項目的原因,寫了很多次樹形組件,越寫越覺得可以寫得更簡單并且更具有復(fù)用性、擴展性。樹組件的應(yīng)用場景很多,比如一篇文章的目錄、一個公司部門組織情況、思維導(dǎo)圖等,其實都可以用樹形結(jié)構(gòu)來描述。
        本文講述一下Vue中樹組件的簡單實現(xiàn)。
        樹組件在線體驗地址:http://wintc.top/laboratory/#/tree。

        一、樹形數(shù)據(jù)結(jié)構(gòu)

          樹形數(shù)據(jù)是指形如以下的數(shù)據(jù)結(jié)構(gòu):
        [ { id: '1', title: '節(jié)點1' children: [ { id: '1-1', title: '節(jié)點1-1' }, { id: '1-2', title: '節(jié)點1-2' } ] }, { id: '2', title: '節(jié)點2', children: [ { id: '2-1', title: '節(jié)點2-1' }, { id: '2-2', title: '節(jié)點2-2' } ] }, { id: '3', title: '節(jié)點3' }]
        這并不是《數(shù)據(jù)結(jié)構(gòu)與算法》里嚴(yán)格意義上的樹定義,嚴(yán)格的樹定義,第一層應(yīng)該是一個根節(jié)點,而此處的第一層就包含了多個節(jié)點。
        不過這不重要,實用為上,這樣的結(jié)構(gòu)或許更加通用(試想,如果第一層是只包含一個節(jié)點的樹,和標(biāo)準(zhǔn)定義的樹又有什么本質(zhì)區(qū)別呢)。
        樹結(jié)構(gòu)是遞歸的,它可能有很多級,我們在渲染樹結(jié)構(gòu)的時候也采用遞歸的方式來渲染。

        二、Vue樹組件實現(xiàn)的兩個重要屬性

        1、組件的name屬性

        或許我們在平常開發(fā)的過程中都很少使用這個屬性(至少我是如此),不過這個屬性卻有兩個很重要的作用,摘自Vue官網(wǎng):
        • 允許組件模板遞歸地調(diào)用自身。注意,組件在全局用?Vue.component()?注冊時,全局 ID 自動作為組件的 name。

        • 指定?name?選項的另一個好處是便于調(diào)試。有名字的組件有更友好的警告信息。另外,當(dāng)在有 vue-devtools,未命名組件將顯示成?,這很沒有語義。通過提供?name?選項,可以獲得更有語義信息的組件樹。

        這里我們因為要遞歸地渲染樹形結(jié)構(gòu),即渲染樹節(jié)點的時候使用當(dāng)前組件作為子組件,所以會用到name屬性。

        2、插槽

        Vue插槽借鑒于Web components,是在父組件自定義實現(xiàn)子組件部分dom的一個方法,這大大提高了子組件的復(fù)用性和擴展性。

        下面是一個簡單的插槽使用例子。

        子組件:

        父組件:
        渲染結(jié)果:
        父組件可以通過v-slot提供一些插槽來達到組件內(nèi)容自定義的目的,只要子組件模板里預(yù)留了這些插槽的位置。
        插槽可以有名字作為唯一標(biāo)識,如也可以不設(shè)置名字而使用默認(rèn)值default;父組件中填充插槽使用v-slot:name填充對應(yīng)的插槽,name表示填充的插槽名稱,未指定名字的插槽填充時使用v-slot:default或v-slot,二者作用是相同的。
        關(guān)于Vue插槽,官網(wǎng)描述很清楚了,這里不再贅述。此處介紹幾種插槽的特殊用法。

        1)、作用域插槽

        默認(rèn)情況下,父組件模板里通過插槽插入的部分只能訪問父組件上下文,如果你需要訪問子組件的部分屬性,可以通過作用域插槽:在子組件中給slot傳遞一些prop,然后在父組件插入內(nèi)容時使用這些prop,示例如下。
        子組件:

        父組件:
        someProp是可以解構(gòu)的,可以把從子組件傳遞給插槽的prop解構(gòu)出來直接使用: v-slot:default="{ nodeData }"。

        2)、插槽函數(shù)

        從Vue2.6.0開始,所有的插槽(包括作用域插槽和普通插槽)都會作為一個函數(shù),并通過vm.$scopeSlots暴露出來,比如上述父組件模板中給子組件插入了一個作用域插槽(名字為默認(rèn)的default),在子組件實例的$scopeSlots就會暴露對應(yīng)的函數(shù):

        傳遞相應(yīng)的參數(shù)(比如nodeData)調(diào)用這個函數(shù),就可以得到插槽對應(yīng)的虛擬DOM即VNode,在render函數(shù)中非常好使。
        只要你能訪問到這個函數(shù),就可以生成對應(yīng)的虛擬DOM(并不是非得在當(dāng)前組件),接下來在樹組件葉子節(jié)點的渲染中,會用到這個用法。

        三、樹組件渲染的實現(xiàn)

        1、樹組件調(diào)用形式

        作為一個可復(fù)用的樹節(jié)點,渲染出來的樹結(jié)構(gòu)應(yīng)該是可以自定義的,同時對于傳入組件的prop盡可能簡單。

        這里設(shè)計的prop僅傳入一個樹形數(shù)據(jù)treeData,對于每一個節(jié)點,使用作用域插槽提供每一個節(jié)點的數(shù)據(jù)來調(diào)用者自定義渲染。所以組件調(diào)用形式很簡單:

        這里的調(diào)用僅僅把節(jié)點的文本渲染出來了,通常結(jié)合具體的場景,可能我們會有更多的功能需求,比如展開折疊,刪除節(jié)點,添加節(jié)點等,給組件添加一個ref屬性,我們可以方便地調(diào)用組件提供的函數(shù)。

        2、樹組件代碼實現(xiàn)

        通常遞歸實現(xiàn)樹組件會分為兩個部分:
        • 樹節(jié)點渲染組件,該組件通過歸調(diào)用自身渲染一個子樹,一直遞歸到渲染完全部葉子節(jié)點。

        • 供外部調(diào)用的樹形組件,提供一些外部調(diào)用的接口

        下面直接給出樹組件、節(jié)點組件的簡單代碼實現(xiàn)如下:
        樹節(jié)點組件tree-node.vue:

         樹組件tree.vue:


        有幾個點值得注意:
        • 樹組件的componentMap保存了所有后代組件的引用。這樣好處在于:在使用tree組件的時候,我們直接訪問的只有樹組件,想直接調(diào)用葉子節(jié)點的相關(guān)方法,可以通過樹組件做轉(zhuǎn)發(fā)。比如想讓id為1的節(jié)點折疊起后代元素,可以調(diào)用this.$refs.tree.showChildren(1, true),在樹組件的showChildren函數(shù)內(nèi),取出對應(yīng)的節(jié)點組件,調(diào)用節(jié)點組件的方法。

        • 節(jié)點自身內(nèi)容的渲染。節(jié)點組件的tree樹形保存了樹組件的引用,節(jié)點自身內(nèi)容的渲染,使用了一個子組件node-content。而node-content的內(nèi)容,來自于樹組件的插槽,我們通過前面所描述函數(shù)形式訪問到樹組件的插槽,調(diào)用函數(shù)得到了虛擬DOM,作為組件node-content的內(nèi)容。當(dāng)然如果未提供插槽,node-content的內(nèi)容會是一段提醒含義的html串,提醒使用者插入插槽(你也可以修改為一個默認(rèn)的渲染,比如渲染出nodeData.title)。

        • 在提供的作用域插槽中,node-content組件向該插槽傳遞了parentData(上級節(jié)點數(shù)據(jù)), data(本級節(jié)點數(shù)據(jù)), level(層級)等一些可能常用的屬性。

        上述提供的樹組件比較簡單,僅僅提供了渲染樹形結(jié)構(gòu)、展開/折疊等功能,但是作為一個示例性的樹形組件,它還是具有很強地擴展性以及復(fù)用性。
        因為使用Vue,我們用數(shù)據(jù)控制視圖,所以你在使用的過程中想給組件增加比如節(jié)點多選、增刪節(jié)點等操作,其實非常簡單,你只用修改你的樹形數(shù)據(jù),并且在插槽上做相應(yīng)的視圖處理即可(比如增加選擇框、添加下級/刪除節(jié)點等菜單)。
        具體使用代碼可以在github查看,或在線體驗:http://wintc.top/laboratory/#/tree。
        本文完~
        瀏覽 59
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            www毛片 | 亚洲人妻无码系列 | 精品久久免费视频 | 琪琪成人| 重囗味另类老妇506070 | 嫦娥性艳史电影bd播放 | 粉嫩av懂色av蜜臀av熟妇 | 少妇wbb搡bbbb揉bbbb | 欧美久久片 | 黑人日亚洲美女 |