Vue樹形組件詳解

Vue樹形組件是一個非常常用的組件,可以用於展示數據的層級結構,比如樹形菜單、文件目錄樹等等。在Vue框架中,有很多非常好用的樹形組件庫,比如element-ui、iview、vue-treeselect等等,本文將主要介紹基於vue組件開發的樹形組件。

一、懶加載

當有大量的節點需要渲染時,我們可以採用懶加載的方式來優化性能。我們可以只渲染目前可視範圍內的節點,當用戶需要展開某一個節點時再渲染其子節點。這種方式可以充分利用虛擬列表技術來減小渲染開銷,提高組件的渲染性能。


// 自定義一個樹形節點組件
<template>
  <div :style="{ marginLeft: level * 20 + 'px' }">
    <i v-if="isFolder" :class="{ open: open, close: !open }" @click="toggle"></i>
    <span>{{ name }}</span>
  </div>
</template>
 
// 通過watch監聽是否需要懶加載子節點
watch: {
  open(val) {
    if (val) {
      // 模擬異步加載子節點
      setTimeout(() => {
        this.children = [
          { name: '子節點1', isFolder: false },
          { name: '子節點2', isFolder: false },
          { name: '子節點3', isFolder: false }
        ]
      }, 1000)
    }
  }
}

二、樹形菜單

樹形菜單是一種很常用的樹形組件,往往用於網站的導航菜單等場景。我們可以通過遍曆數據源來手動構建一個樹形菜單組件。


<template>
  <ul>
    <li v-for="(item, index) in list" :key="index">
      <div @click="handleClick(item)">{{ item.name }}</div>
      <template v-if="item.children">
        <tree-menu :list="item.children"></tree-menu>
      </template>
    </li>
  </ul>
</template>
 
<script>
export default {
  name: 'TreeMenu',
  props: ['list'],
  methods: {
    handleClick(item) {
      console.log(item.name)
    }
  }
}
</script>

三、右鍵新增刪除編輯

對於一些需要進行增刪改查操作的樹形組件,我們可以為每一個節點綁定相關的右鍵菜單,通過彈出式菜單讓用戶可以方便地對節點進行修改。


<template>
  <div>
    <ul>
      <li v-for="(item, index) in list" :key="index" @contextmenu.prevent="showContextMenu($event, item)">
        <span @dblclick="handleEdit(item)">{{ item.name }}</span>
        <template v-if="item.children">
          <tree-node :list="item.children"></tree-node>
        </template>
      </li>
    </ul>
    <ul v-show="contextMenu.show" :style="{ left: contextMenu.left + 'px', top: contextMenu.top + 'px' }">
      <li @click="handleAdd">新增節點</li>
      <li @click="handleDelete">刪除節點</li>
      <li @click="handleEdit(contextMenu.node)">編輯節點</li>
    </ul>
  </div>
</template>
 
<script>
export default {
  name: 'TreeNode',
  props: ['list', 'level'],
  data() {
    return {
      contextMenu: {
        show: false,
        node: null,
        left: 0,
        top: 0
      }
    }
  },
  methods: {
    showContextMenu(event, item) {
      event.stopPropagation()
      event.preventDefault()
      this.contextMenu.show = true
      this.contextMenu.node = item
      this.contextMenu.left = event.clientX
      this.contextMenu.top = event.clientY
    },
    handleAdd() {
      // 新增節點操作
    },
    handleDelete() {
      // 刪除節點操作
    },
    handleEdit(item) {
      // 編輯節點操作
    }
  }
}
</script>

四、添加和刪除

對於一些需要進行動態添加和刪除的樹形組件,我們可以通過數據源的變化來動態響應視圖的變化。


<template>
  <div>
    <button @click="add">> 新增 </button>
    <ul>
      <li v-for="(item, index) in list" :key="index">
        <div>{{ item.name }}</div>
        <button @click="remove(index)"> 刪除 </button>
        <template v-if="item.children">
          <tree-node :list="item.children"></tree-node>
        </template>
      </li>
    </ul>
  </div>
</template>
 
<script>
export default {
  name: 'TreeNode',
  props: ['list', 'level'],
  methods: {
    add() {
      this.list.push({
        name: `節點${this.list.length + 1}`,
        children: []
      })
    },
    remove(index) {
      this.list.splice(index, 1)
    }
  }
}
</script>

五、樹形組件選取

一些業務場景需要通過樹形組件來進行數據的選取,比如城市選擇器、商品分類選擇器等等。我們可以通過綁定單選、多選的事件來實現選取功能。


<template>
  <div>
    <ul>
      <li v-for="(item, index) in list" :key="index">
        <label :for="'checkbox-' + index">
          <input :id="'checkbox-' + index" type="checkbox" :checked="item.checked" @change="handleCheck(item)">
          {{ item.name }}
        </label>
        <template v-if="item.children">
          <tree-node :list="item.children"></tree-node>
        </template>
      </li>
    </ul>
  </div>
</template>
 
<script>
export default {
  name: 'TreeNode',
  props: ['list'],
  methods: {
    handleCheck(item) {
      if (item.children && item.children.length) {
        this.$emit('checkAll', item)
      } else {
        this.$emit('check', item)
      }
    }
  }
}
</script>

六、總結

Vue樹形組件是一個非常常用的組件,需要根據具體業務場景選擇使用相關的庫或者依據業務需求自主開發。在開發過程中,我們要特別關注組件的性能和用戶體驗,優化渲染、增加交互等技巧都可以有效地提高用戶的滿意度和使用體驗。

原創文章,作者:WYQW,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/136086.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WYQW的頭像WYQW
上一篇 2024-10-04 00:15
下一篇 2024-10-04 00:15

相關推薦

  • 使用Vue實現前端AES加密並輸出為十六進制的方法

    在前端開發中,數據傳輸的安全性問題十分重要,其中一種保護數據安全的方式是加密。本文將會介紹如何使用Vue框架實現前端AES加密並將加密結果輸出為十六進制。 一、AES加密介紹 AE…

    編程 2025-04-29
  • Vue TS工程結構用法介紹

    在本篇文章中,我們將從多個方面對Vue TS工程結構進行詳細的闡述,涵蓋文件結構、路由配置、組件間通訊、狀態管理等內容,並給出對應的代碼示例。 一、文件結構 一個好的文件結構可以極…

    編程 2025-04-29
  • 如何修改ant組件的動效為中心

    當我們使用Ant Design時,其默認的組件動效可能不一定符合我們的需求,這時我們需要修改Ant Design組件動效,使其更加符合我們的UI設計。本文將從多個方面詳細闡述如何修…

    編程 2025-04-29
  • Ant Design組件的動效

    Ant Design是一個基於React技術棧的UI組件庫,其中動效是該組件庫中的一個重要特性之一。動效的使用可以讓用戶更清晰、更直觀地了解到UI交互的狀態變化,從而提高用戶的滿意…

    編程 2025-04-29
  • Vue3的vue-resource使用教程

    本文將從以下幾個方面詳細闡述Vue3如何使用vue-resource。 一、安裝Vue3和vue-resource 在使用vue-resource前,我們需要先安裝Vue3和vue…

    編程 2025-04-27
  • Vue模擬按鍵按下

    本文將從以下幾個方面對Vue模擬按鍵按下進行詳細闡述: 一、Vue 模擬按鍵按下的場景 在前端開發中,我們常常需要模擬按鍵按下的場景,比如在表單中填寫內容後,按下“回車鍵”提交表單…

    編程 2025-04-27
  • ThinkPHP6 + Vue.js: 不使用Fetch的數據請求方法

    本文將介紹如何在ThinkPHP6和Vue.js中進行數據請求,同時避免使用Fetch函數。 一、AJAX:XMLHttpRequest的基礎使用 在進行數據請求時,最基礎的方式就…

    編程 2025-04-27
  • 開發前端程序,Vue是否足夠?

    Vue是一個輕量級,高效,漸進式的JavaScript框架,用於構建Web界面。開發人員可以使用Vue輕鬆完成前端編程,開發響應式應用程序。然而,當涉及到需要更大的生態系統,或利用…

    編程 2025-04-27
  • 用mdjs打造高效可復用的Web組件

    本文介紹了一個全能的編程開發工程師如何使用mdjs來打造高效可復用的Web組件。我們將會從多個方面對mdjs做詳細的闡述,讓您輕鬆學習並掌握mdjs的使用。 一、mdjs簡介 md…

    編程 2025-04-27
  • Spring MVC主要組件

    Spring MVC是一個基於Java語言的Web框架,是Spring Framework的一部分。它提供了用於構建Web應用程序的基本架構,通過與其他Spring框架組件集成,使…

    編程 2025-04-27

發表回復

登錄後才能評論