Как показать только каталог, используя `v-treeview` в vuetify?

#vue.js #vuejs2 #vuetify.js

#vue.js #vuejs2 #vuetify.js

Вопрос:

Я пытаюсь показать только каталог / папки, используя v-treeview . Объект ответа поступает как родительско-дочерняя комбинация

  • Если родительская папка, то тип directory
  • Если дочерний элемент является файлом, то тип file

Ниже приведен мой код:

 <v-treeview v-model="tree" :items="fileStructure" activable item-key="path" :open="open" :filter="filter" :search="search" open-on-click>
          <template v-slot:prepend="{ item, open }">
            <v-icon v-if="item.type == 'directory'" color="blue-grey darken-1">
              {{ open ? 'mdi-folder-open' : 'mdi-folder' }}
            </v-icon>
          </template>
          <template v-if="item.type == 'directory'" slot="label" slot-scope="{ item }">
            <a @click="showSelectedSubFolders(item)" v-if="item.type == 'directory'">{{ item.name }}</a>
          </template>
</v-treeview>
  

Теперь, используя приведенный выше код, файлы не отображаются под папкой, но при нажатии на папку создается пустое пространство.

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

Ответ №1:

Поскольку вы хотите показывать только папки, я предлагаю фильтровать fileStructure с помощью вычисляемого свойства:

 computed: {
  filteredItems() {
    const temp = JSON.parse(JSON.stringify(this.fileStructure))
    
    function f(item) {
      if(item.children) {
        item.children = item.children.filter(f)
      }
      return item.type === "directory"
    }

    return temp.filter(f)
  }
}
  

Это создало глубокую копию fileStructure , поэтому мы не изменяем исходный массив. Затем элементы рекурсивно фильтруются для каталога типа.
Таким образом, мы можем избавиться от ifs в html, и нам нужно только проверить, есть ли у элемента дочерние элементы.

 <v-treeview v-model="tree" :items="filteredItems" activable item-key="path" :open="open" :filter="filter" :search="search" open-on-click>
  <template v-slot:prepend="{ item, open }">
    <v-icon v-if="item.children amp;amp; item.children.length > 0" color="blue-grey darken-1">
      {{ open ? 'mdi-folder-open' : 'mdi-folder' }}
    </v-icon>
  </template>
  <template slot="label" slot-scope="{ item }">
    <a @click="showSelectedSubFolders(item)">{{ item.name }}</a>
  </template>
</v-treeview>
  

Комментарии:

1. Мне нравится эта идея. Я должен показать все файлы в выбранной папке с правой стороны. У вас есть какие-либо идеи, почему я могу это сделать? @Jay Холодильник

2. Поскольку этот ответ решил ваш вопрос, я бы посоветовал вам принять его, а затем задать другой вопрос относительно вашей новой проблемы.