• Vue iview Tree组件实现文件目录-基础实现


    注册页面路由

    router/router.js

      {
        path: 'folder_tree',
        name: 'folderTree',
        component: () => import('@/views/folder-tree/folder-tree.vue')
      }
    

    定义api请求

    api/data.js

    export const getFolderList = () => {
      return axios.request({
        url: '/getFolderList',
        method: 'get'
      })
    }
    
    export const getFileList = () => {
      return axios.request({
        url: '/getFileList',
        method: 'get'
      })
    }
    

    mock数据

    mock/index.js

    import Mock from 'mockjs'
    import { getFileList, getFolderList } from './response/data'
    const Random = Mock.Random
    
    
    Mock.mock(//getFileList/, 'get', getFileList)
    Mock.mock(//getFolderList/, 'get', getFolderList)
    
    export default Mock
    

    mock/response/data.js

    import { doCustomTimes } from '@/lib/tools'
    import Mock from 'mockjs'
    const Random = Mock.Random
    
    export const getFolderList = () => {
      const template1 = {
        'name|1': '@word',
        'creat_time': '@datetime',
        'folder_id': 0,
        'id|+1': 1
      }
      const template2 = {
        'name|1': '@word',
        'creat_time': '@datetime',
        'folder_id|+1': 1,
        'id|+1': 4
      }
      let arr = []
      doCustomTimes(3, () => {
        arr.push(Mock.mock(template1))
      })
      doCustomTimes(2, () => {
        arr.push(Mock.mock(template2))
      })
      return arr
    }
    

    自定义函数

    lib/tools.js

    // 调用times次callback
    export const doCustomTimes = (times, callback) => {
      let i = -1
      while (++i < times) {
        callback()
      }
    }
    

    使用

    iviews/folder-tree/folder-tree.vue

    <template>
      <h1>folder-tree page</h1>
    </template>
    <script>
    import { getFolderList, getFileList } from '@/api/data'
    export default {
      data () {
        return {
          folderList: [],
          fileList: []
        }
      },
      mounted () {
        Promise.all([getFolderList(), getFileList()]).then(res => {
          console.log(res)
        })
      }
    }
    </script>
    

    **图folder**![在这里插入图片描述](https://img-blog.csdnimg.cn/20190604023212677.png)**图file**![在这里插入图片描述](https://img-blog.csdnimg.cn/20190604023739660.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjM2MTQw,size_16,color_FFFFFF,t_70)


    将文件放在对应的文件夹里

    lib/util.js

    import clonedeep from 'clonedeep'
    
    export const putFileInFolder = (folderList, fileList) => {
      const folderListCloned = clonedeep(folderList)
      const fileListCloned = clonedeep(fileList)
      return folderListCloned.map(folderItem => {
        const folderId = folderItem.id
        let index = fileListCloned.length
        while (--index >= 0) {
          const fileItem = fileListCloned[index]
          if (fileItem.folder_id === folderId) {
            const file = fileListCloned.splice(index, 1)[0]
            file.title = file.name
            if (folderItem.children) folderItem.children.push(file)
            else folderItem.children = [file]
          }
        }
        folderItem.type = 'folder'
        return folderItem
      })
    }
    

    folder-tree.vue

    Promise.all([getFolderList(), getFileList()]).then(res => {
          console.log(putFileInFolder(res[0], res[1])) // 如图
        })
    

    图:
    在这里插入图片描述
    递归函数(整合文件夹)

    util.js

    export const transferFolderToTree = folderList => {
      if (!folderList.length) return []
      const folderListCloned = clonedeep(folderList)
      const handle = id => {
        let arr = []
        folderListCloned.forEach(folder => {
          if (folder.folder_id === id) {
            const children = handle(folder.id)
            if (folder.children) {
              folder.children = [].concat(folder.children, children)
            } else {
              folder.children = children
            }
            folder.title = folder.name
            arr.push(folder)
          }
        })
        return arr
      }
      return handle(0)
    }
    

    在这里插入图片描述


    1. Tree组件使用

    srcviewsfolder-treefolder-tree.vue

    <template>
      <Tree :data="folderTree"></Tree>
    </template>
    <script>
    import { getFolderList, getFileList } from '@/api/data'
    import { putFileInFolder, transferFolderToTree } from '@/lib/util'
    export default {
      data () {
        return {
          folderList: [],
          fileList: [],
          folderTree: []
        }
      },
      mounted () {
        Promise.all([getFolderList(), getFileList()]).then(res => {
          this.folderTree = transferFolderToTree(putFileInFolder(res[0], res[1]))
        })
      }
    }
    </script>
    
    1. 扁平数据树状化

    在这里插入图片描述
    3 ## 自定义组件结构

    srcviewsfolder-treefolder-tree.vue

    <template>
      <div class="folder-wrapper">
        <Tree :data="folderTree" :render="renderFunc"></Tree>
      </div>
    </template>
    <script>
    import { getFolderList, getFileList } from '@/api/data'
    import { putFileInFolder, transferFolderToTree } from '@/lib/util'
    export default {
      data () {
        return {
          folderList: [],
          fileList: [],
          folderTree: [],
          renderFunc: (h, { root, node, data }) => {
            return (
              <div class="tree-item">
                {data.type === 'folder' ? (
                  <icon
                    type="ios-folder"
                    color="#2d8cf0"
                    style="margin-right: 5px;"
                  />
                ) : (
                  ''
                )}
                {data.title}
              </div>
            )
          }
        }
      },
      mounted () {
        Promise.all([getFolderList(), getFileList()]).then(res => {
          this.folderTree = transferFolderToTree(putFileInFolder(res[0], res[1]))
        })
      }
    }
    </script>
    <style lang="less">
    .folder-wrapper {
      width: 300px;
      .tree-item {
        display: inline-block;
        width: ~"calc(100% - 50px)";
        height: 30px;
        line-height: 30px;
      }
    }
    </style>
    

    在这里插入图片描述

  • 相关阅读:
    EventHandler 与常见的.Net预定义委托
    Consistent Hashing算法及相关技术
    全序, 分布式一致性的本质
    Paxos Made Simple
    Strong Consistency, 强一致性技术概述
    Chubby lock service for looselycoupled distributed systems
    AntiEntropy Protocols
    Mesos: A Platform for FineGrained Resource Sharing in the Data Center
    Spark A FaultTolerant Abstraction for InMemory Cluster Computing
    Vector Clocks, 时间向量
  • 原文地址:https://www.cnblogs.com/izhaong/p/12154276.html
Copyright © 2020-2023  润新知