логотип PurpleSchool
логотип PurpleSchool

5 библиотек для создания tree view во Vue

Автор

Олег Марков

Введение

Реализация древовидных структур на веб-странице — частая задача при разработке интерфейсов, где нужно показать иерархию данных. Деревья используются в файловых менеджерах, навигационных меню, редакторах прав доступа и многих других проектах. Если вы работаете с Vue, то вопрос о выборе оптимального компонента для tree-view встанет довольно скоро.

В этой статье я расскажу вам про пять наиболее популярных и функциональных библиотек для создания tree view во Vue. На конкретных примерах покажу, как их использовать, какие функции они предоставляют: перетаскивание, фильтрацию, выделение элементов, работу с большими списками и т.д. Статья поможет вам быстро подобрать библиотеку под свои задачи, понять плюсы и минусы каждого решения и начать использовать выбранный компонент.

Vue-treeselect

Краткий обзор

vue-treeselect — это универсальный компонент дерева с поддержкой поиска, мультивыбора, асинхронной загрузки и расширения через слоты. Его часто выбирают для задач, где требуется комбо-дерево с фильтрацией.

Ключевые особенности

  • Мультивыбор (или одиночный выбор)
  • Фильтрация/поиск по узлам
  • Возможность отображения тысяч элементов за счет lazy loading
  • Асинхронная загрузка данных
  • Поддержка настроек визуализации через пользовательские слоты

Пример установки и базового использования

Давайте начнем с простой интеграции:

npm install @riophae/vue-treeselect

В файле компонента:

import Treeselect from '@riophae/vue-treeselect'
// Не забудьте подключить стили
import '@riophae/vue-treeselect/dist/vue-treeselect.css'

В шаблоне можно использовать так:

<template>
  <treeselect
    v-model="selected"
    :multiple="true"
    :options="options"
    placeholder="Выберите элементы"
  />
</template>

<script>
export default {
  components: { Treeselect },
  data() {
    return {
      selected: [],
      // Пример структуры данных для дерева
      options: [
        {
          id: 'folder1',
          label: 'Папка 1',
          children: [
            { id: 'file1', label: 'Файл 1' },
            { id: 'file2', label: 'Файл 2' }
          ]
        },
        {
          id: 'folder2',
          label: 'Папка 2'
        }
      ]
    }
  }
}
</script>

// Здесь компонент показывает дерево с двумя корневыми узлами и вложенными файлами.

Асинхронная загрузка данных

Когда у вас много данных и вы хотите подгружать их по мере раскрытия узлов, воспользуйтесь событиями компонента:

methods: {
  loadChildren({ action, parentNode, callback }) {
    // Ваш асинхронный запрос к серверу
    fetch(`/folders/${parentNode.id}/children`)
      .then(response => response.json())
      .then(children => callback(null, children))
      .catch(error => callback(error))
  }
}

Добавьте в компоненте prop :load-options="loadChildren".

Когда стоит выбирать vue-treeselect

Если вам нужна мощная поддержка поиска, простой кастомизации и хорошая работа со средними объемами данных — эта библиотека отличный вариант. Особенно она любима для форм, связанных со сложными категориями или деревьями тегов.

Vue-draggable-nested-tree

Краткий обзор

Библиотека, ориентированная на задачи drag-and-drop: перетаскивание узлов дерева с возможностью менять структуру. Это идеальный выбор для интерактивных менеджеров файлов или категорий.

Основные возможности

  • Перетаскивание элементов с изменением структуры
  • Поддержка глубоко вложенных узлов
  • Кнопки быстрого добавления и удаления нод
  • Опциональный рендеринг кастомных элементов для каждого узла

Установка и инит компонента

npm install vue-draggable-nested-tree

Пример использования с настройкой опций:

<template>
  <vue-draggable-nested-tree
    :value="treeData"
    :props="treeProps"
    @change="onChange"
  >
    <template v-slot="{ node }">
      <span>
        {{ node.label }}
        <button @click="addChild(node)">+</button>
      </span>
    </template>
  </vue-draggable-nested-tree>
</template>

<script>
import VueDraggableNestedTree from "vue-draggable-nested-tree"

export default {
  components: { VueDraggableNestedTree },
  data() {
    return {
      treeData: [
        {
          id: 1,
          label: 'Категория 1',
          children: [
            { id: 11, label: 'Подкатегория 1.1' }
          ]
        }
      ],
      // Описывает ключи для дерева
      treeProps: {
        children: 'children',
        label: 'label'
      }
    }
  },
  methods: {
    onChange(newTree) {
      // Срабатывает при перетаскивании/изменении дерева
      this.treeData = newTree
    },
    addChild(parent) {
      parent.children = parent.children || []
      parent.children.push({ id: Date.now(), label: 'Новый элемент' })
    }
  }
}
</script>

// Здесь вы можете перетаскивать элементы, а также добавлять новые подузлы через кнопку.

Когда выбирать эту библиотеку

vue-draggable-nested-tree отлично подходит, когда пользователь должен активно редактировать структуру дерева. Хорошо работает в админках, редакторах меню и внутри веб-приложений с управлением иерархией.

Vue Tree View

Краткий обзор

vue-tree-view — простое, но гибкое решение, позволяющее построить дерево с поддержкой открытия/закрытия ветвей. Это более легковесная альтернатива тяжелым библиотекам.

Возможности

  • Нативное раскрытие/скрытие узлов
  • Выбор ноды кликом
  • Минимум зависимостей и легкость стилизации
  • Можно использовать как “read-only” дерево или добавить обработчики событий

Пример базовой интеграции

Установим через NPM:

npm install vue-tree-view

Используем в компоненте:

<template>
  <tree-view :data="treeData" @nodeClick="onNodeClick"/>
</template>

<script>
import TreeView from 'vue-tree-view'

export default {
  components: { TreeView },
  data() {
    return {
      treeData: [
        {
          name: "Папка 1",
          children: [
            { name: "Файл 1.1" },
            { name: "Файл 1.2" }
          ]
        },
        {
          name: "Папка 2"
        }
      ]
    }
  },
  methods: {
    onNodeClick(node) {
      // Действие при выборе узла
      alert("Выбрано: " + node.name)
    }
  }
}
</script>

// В этом примере дерево показывает две папки. По клику можно узнать, какой элемент выбран.

Когда стоит использовать

Для задач, где основная цель — просто отобразить иерархию и не требуется drag-and-drop или расширенный функционал. Отлично для быстрых прототипов, кастомных меню, небольших файловых деревьев.

Vue-json-tree-view

Краткий обзор

Простое, но мощное решение, ориентированное на отображение JSON-структур в виде дерева, с возможностью разворачивания/сворачивания узлов.

Ключевые функции

  • Автоматическая поддержка любых JSON-данных (глубоко вложенные объекты/массивы)
  • Раскрытие/закрытие любого уровня
  • Минимальная конфигурация
  • Отлично подходит для инструментов по просмотру JSON

Установка и минимальный пример

npm install vue-json-tree-view

Использование:

<template>
  <json-tree :data="jsonData"/>
</template>

<script>
import JsonTree from 'vue-json-tree-view'

export default {
  components: { JsonTree },
  data() {
    return {
      jsonData: {
        user: {
          id: 1,
          name: "Иван",
          config: {
            theme: "dark",
            notifications: true
          }
        },
        tags: ["vue", "tree", "json"]
      }
    }
  }
}
</script>

// Здесь библиотека автоматически прорисует дерево для структуры данных, которую вы передадите.

Когда выбирать vue-json-tree-view

Когда нужно визуализировать произвольную вложенную структуру, особенно общего назначения (например, результаты API-запросов, дебаг-данные или редактирование JSON).

Vue3 Tree

Краткий обзор

Эта библиотека создана именно для Vue 3. Она сочетает легкость интеграции, высокую производительность и современную архитектуру с поддержкой TypeScript.

Основные преимущества

  • Поддержка Vue 3 и Composition API
  • Гибкое управление раскрытием, выделением, фильтрацией узлов
  • Скорость работы даже с крупными структурами (1000+ узлов)
  • Настройка кастомного шаблона отображения ветвей через scoped slots
  • Активно развивается

Пример использования

Добавим:

npm install vue3-tree

В компоненте:

<template>
  <Vue3Tree
    :nodes="treeNodes"
    :options="treeOptions"
    @node-click="handleNodeClick"
  />
</template>

<script>
import { Vue3Tree } from 'vue3-tree'

export default {
  components: { Vue3Tree },
  data() {
    return {
      treeNodes: [
        {
          id: 1,
          label: 'Категория',
          children: [
            { id: 2, label: 'Подкатегория 1' },
            { id: 3, label: 'Подкатегория 2' }
          ]
        }
      ],
      treeOptions: {
        selectable: true,
        showCheckbox: true,
        draggable: false  // если потребуется drag-n-drop, этот параметр можно включить
      }
    }
  },
  methods: {
    handleNodeClick(node) {
      // Действие при клике по узлу
      console.log('Кликнули по узлу', node)
    }
  }
}
</script>

// Пример показывает, как быстро можно интегрировать vue3-tree в современный проект.

Для кого и для чего подходит

Если вы уже используете Vue 3, хотите использовать TypeScript и ищете гибкое, быстрое дерево, — это оптимальный выбор. Позволяет “дотюнивать” отображение и поведение узлов без написания собственных велосипедов.

Сравнительная таблица библиотек

БиблиотекаКраткое описаниеОсновные фичиДля Vue 3Drag-and-dropКастомизация
vue-treeselectМощное комбо-дерево с поиском и мультивыборомПоиск, async data, множественный выборНе полностьюНетВысокая
vue-draggable-nested-treeDrag-and-drop, интерактивное деревоDrag-n-drop, редактирование структурыЧастичноДаСредняя
vue-tree-viewПростой компонент для отображения дереваОткрытие/закрытие узловНетНетОграниченная
vue-json-tree-viewДинамический просмотр JSONFlattens JSON, editable viewДаНетСредняя
vue3-treeЛегкий современный компонент для Vue 3Выделение, фильтрация, слотыДаДаВысокая

Заключение

Выбор библиотеки для tree view в Vue зависит прежде всего от ваших целей, версии Vue, требованиям по кастомизации и редактируемости. Если вы реализуете формы с деревьями — вам подойдет vue-treeselect. Для управления структурой с перетаскиванием лучше выбрать vue-draggable-nested-tree или vue3-tree. Для визуализации структурированных данных или JSON подходят vue-tree-view и vue-json-tree-view.

Каждая из библиотек хорошо документирована и успешно применяется в реальных проектах. Не бойтесь экспериментировать и комбинировать возможности, чтобы максимально эффективно решать задачи вашего приложения.

Частозадаваемые технические вопросы по теме

Как реализовать большие деревья (1000+ узлов) без потери производительности?

При работе с большими деревьями важно использовать виртуализацию списка или асинхронную подгрузку данных. Например, vue-treeselect поддерживает асинхронную загрузку с помощью свойства :load-options, а vue3-tree изначально оптимизирован для работы с крупными структурами.

Как программно выделить/открыть нужные узлы дерева?

Практически все библиотеки поддерживают управление выделением через привязку к переменным (v-model для vue-treeselect, параметр selected для vue3-tree и т.д.). Просто задайте нужные значения этим переменным в data или через метод.

Как добавить иконки к узлам или изменить их внешний вид?

Почти все рассмотренные библиотеки поддерживают использование слотов или выполняют рендер узла через scoped slots/template. Воспользуйтесь кастомным шаблоном и вставьте туда нужную иконку на ваш выбор. Например, в vue3-tree это делается через slot для узла.

Как реализовать drag-n-drop между двумя разными деревьями?

Для этого потребуется специализированная поддержка в библиотеке. vue-draggable-nested-tree и vue3-tree дают такую возможность через передачу событий перетаскивания и обновление данных вручную в обоих деревьях. Ознакомьтесь с документацией по drag-and-drop событиям этих компонентов.

Можно ли синхронизировать видимость/состояние раскрытых узлов с сервером?

Да, в большинстве библиотек для этого существуют обработчики событий раскрытия (например, @expand/@collapse). В событиях вы можете отправлять информацию о текущем состоянии дерева на сервер и восстанавливать его при инициализации приложения, обновляя связанные переменные.

Интеграция Tailwind CSS с Vue для современных интерфейсовСтрелочка вправо

Все гайды по Vue

Руководство по валидации форм во Vue.jsИнтеграция Tiptap для создания редакторов на VueРабота с таблицами во Vue через TanStackИнструкция по установке и компонентам Vue sliderУправление пакетами Vue js с помощью npmУправление пакетами и node modules в Vue проектахКак использовать meta для улучшения SEO на VueПолный гайд по компоненту messages во Vuejs5 правил использования Inertia с Vue и LaravelРабота с модулями и пакетами в VueИнструкция по работе с grid на VueGithub для Vue проектов - подробная инструкция по хранению и совместной работеНастройка ESLint для Vue проектов и поддержка качества кодаОбработка ошибок и отладка в Vue.jsИспользование Vue Devtools для отладки и мониторинга приложенийРабота с конфигурационными файлами и скриптами VueСоздание и настройка проектов Vue с помощью Vue CLI3 способа интеграции Chart.js с Vue для создания графиковРабота с Canvas во VueИнструкция по реализации календаря во VueРабота с Ant Design Vue для создания UI на Vue
Обзор и использование утилит Vue для удобной разработкиРабота с обновлениями компонента и жизненным циклом updateРазрешение конфликтов и ошибок с помощью Vue resolveИспользование query-параметров и их обработка в маршрутах VueЗагрузка и управление состоянием загрузки в VueИспользование библиотек Vue для расширения функционалаРабота с JSON данными в приложениях VueКак работать с экземплярами компонента Instance во VueПолучение данных и API-запросы во Vue.jsЭкспорт и импорт данных и компонентов в VueОбработка событий и их передача между компонентами VuejsГайд по defineEmits на Vue 3Понимание core функционала Vue и его применениеПонимание и применение Composition API в Vue 3Понимание и работа с компилятором VueКогда и как использовать $emit и call во VueВзаимодействие с внешними API через Axios в Vue
Веб приложения на Vue архитектура и лучшие практикиИспользование Vite для быстрого старта и сборки проектов на Vue 3Работа с URL и ссылками в приложениях на VueРабота с пользовательскими интерфейсами и UI библиотеками во VueОрганизация и структура исходных файлов в проектах VueИспользование Quasar Framework для разработки на Vue с готовыми UI-компонентамиОбзор популярных шаблонов и стартовых проектов на VueИнтеграция Vue с PHP для создания динамичных веб-приложенийКак организовать страницы и маршруты в проекте на VueNuxt JS и Vue 3 для SSR приложенийСоздание серверных приложений на Vue с помощью Nuxt jsИспользование Vue Native для разработки мобильных приложенийОрганизация и управление индексной страницей в проектах VueИспользование Docker для контейнеризации приложений на VueИнтеграция Vue.js с Django для создания полноценных веб-приложенийСоздание и работа с дистрибутивом build dist Vue приложенийРабота со стилями и CSS в Vue js для красивых интерфейсовСоздание и структурирование Vue.js приложенияКак исправить ошибку cannot find module vueНастройка и сборка проектов Vue с использованием современных инструментовИнтеграция Vue с Bitrix для корпоративных решенийРазработка административных панелей на Vue js
5 библиотек для создания tree view во VueИнтеграция Tailwind CSS с Vue для современных интерфейсовИнтеграция Vue с серверной частью и HTTPS настройкамиКак обрабатывать async операции с Promise во VueИнтеграция Node.js и Vue.js для разработки приложенийРуководство по интеграции Vue js в NET проектыПримеры использования JSX во VueГайд по импорту и регистрации компонентов на VueМногоязычные приложения на Vue с i18nИнтеграция FLIR данных с Vue5 примеров использования filter во Vue для упрощения разработки3 примера реализации drag-and-drop во Vue
Управление переменными и реактивными свойствами во VueИспользование v for и slot в VueПрименение v-bind для динамической привязки атрибутов в VueУправление пользователями и их данными в Vue приложенияхСоздание и использование UI Kit для Vue приложенийТипизация и использование TypeScript в VuejsИспользование шаблонов в Vue js для построения интерфейсовИспользование Swiper для создания слайдеров в VueРабота со стилями и стилизацией в VueСтруктура и особенности Single File Components SFC в VueРабота со SCSS в проектах на Vue для стилизацииРабота со скроллингом и прокруткой в Vue приложенияхПрименение script setup синтаксиса в Vue 3 для упрощения компонентовИспользование scoped стилей для изоляции CSS в компонентах Vue3 способа улучшить навигацию Vue с push()Обработка запросов и асинхронных операций в VueПонимание и использование provide inject для передачи данных между компонентамиПередача и использование props в Vue 3 для взаимодействия компонентовПередача данных между компонентами с помощью props в Vue jsУправление property и функциями во Vue.jsРабота со свойствами компонентов VueУправление параметрами и динамическими данными во VueРабота с lifecycle-хуком onMounted во VueОсновы работы с объектами в VueПонимание жизненного цикла компонента Vue js на примере mountedИспользование модальных окон modal в Vue приложенияхИспользование методов в компонентах Vue для обработки логикиИспользование метода map в Vue для обработки массивовИспользование хуков жизненного цикла Vue для управления состоянием компонентаРабота с ключами key в списках и компонентах VueОбработка пользовательского ввода в Vue.jsРабота с изображениями и их оптимизация в VueИспользование хуков жизненного цикла в VueОрганизация сеток и гридов для верстки интерфейсов на VueСоздание и управление формами в VueОрганизация файлов и структура проекта Vue.jsКомпоненты Vue создание передача данных события и emitРабота с динамическими компонентами и данными в Vue3 способа манипулирования DOM на VueРуководство по div во VueИспользование директив в Vue и их расширенные возможностиОсновы и применение директив в VueИспользование директив и их особенности на Vue с помощью defineИспользование компонентов datepicker в Vue для выбора датОрганизация циклов и итераций во VueКак работает компиляция Vue CoreСоздание и использование компонентов в Vue JSОбработка кликов и пользовательских событий в VueИспользование классов в Vue для организации кода и компонентовИспользование директивы checked для управления состоянием чекбоксов в VueГайд на checkbox компонент во VueОтображение данных в виде графиков с помощью Vue ChartСоздание и настройка кнопок в VueСоздание и настройка кнопок в Vue приложенияхРабота с lifecycle-хуками beforeCreate и beforeMount во VueИспользование массивов и методов их обработки в VueИспользование массивов и их обработка в Vue
Использование Vuetify для создания современных интерфейсов на VueИспользование transition во VueТестирование компонентов и приложений на VueРабота с teleport для управления DOM во VueПять шагов по настройке SSR в VuejsИспользование Shadcn UI компонентов с Vue для продвинутых интерфейсовИспользование router-link для навигации в Vue RouterКак использовать require в Vue для динамического импорта модулейРабота с динамическим рендерингом и виртуальным DOM на Vue.jsИспользование ref для управления ссылками и реактивностью в Vue 3Использование Vue Pro и его преимущества для профессиональной разработкиРуководство по nextTick для работы с DOMСоздание и использование компонентов с помощью Vue js и CУправление состоянием и реактивностью через inject и provideДинамическое обновление компонентов и данных на VueГлубокое изучение документации Vue и как эффективно её использоватьИспользование Crystal с Vue для разработкиИспользование вычисляемых свойств для динамического отображения данных на Vue jsОптимизация производительности и предупреждения в Vue
Открыть базу знаний