美文网首页
封装tree-基础实现

封装tree-基础实现

作者: 幻影翔 | 来源:发表于2019-12-31 21:40 被阅读0次

实现功能

  • Tree 组件使用
  • 扁平数据树状化
  • 自定义组件结构

实现效果

tree目录

实现过程

拼装数据

title下包含children


数据结构

数据封装工具类 lib/util.js

// 添加文件进文件夹
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;
    });
};

// 扁平文件夹组装为树状
export const transformFolderToTree = 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);
};

视图使用 folder-tree.vue

<template>
    <div class="folder-wrapper">
        <Tree :data="folderTree" :render="renderFunc"></Tree>
    </div>
</template>
<script>
    import { getFolderList, getFileList } from "@/api/data";
    import { putFileInFolder, transformFolderToTree } 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:10px;"/> : ''}
                            { data.title }
                        </div>
                    )
                }
            }
        },
        mounted () {
            Promise.all([getFolderList(), getFileList()]).then(res => {
                this.folderTree = transformFolderToTree(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>

Mock 模拟数据

// api/data.js 定义接口
export const getFolderList = () => {
    return axios.request({
        url: '/getFolderList',
        method: 'get'
    })
}

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

//mock 提供数据
import { doCustomTimes } from '@/lib/tools'
import Mock from 'mockjs'

export const getFileList = () => {
    const template = {
        'name|5': '@cword',
        'create_time': '@datetime',
        'folder_id|1-5': 0,
        'id|+1': 1000
    };
    let arr = [];
    doCustomTimes(10, () => {
        arr.push(Mock.mock(template));
    });
    return arr;
};
export const getFolderList = () => {
    const template1 = {
        'name|1': '@word',
        'create_time': '@datetime',
        'folder_id': 0,
        'id|+1': 1
    };
    const template2 = {
        'name|1': '@word',
        'create_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/tool.js 定义doCustomTimes
export const doCustomTimes = (times, callback) => {
    let i = -1
    while (++i < times) {
        callback()
    }
}

// Mock/index.js 调用
import Mock from 'mockjs'
import { getFolderList, getFileList } from './response/data'

Mock.mock('/getFolderList',getFolderList)
Mock.mock('/getFileList',getFileList)

相关文章

  • 封装tree-基础实现

    实现功能 Tree 组件使用 扁平数据树状化 自定义组件结构 实现效果 实现过程 拼装数据 title下包含chi...

  • Android Retrofit 2 + Retrofit 2

    实现MVC基础框架实现MVP基础框架(一)Android Retrofit 2 + Retrofit 2 封装(二...

  • 第七章 RabbitMQ基础架构设计思路

    课程导航 一线大厂的MQ组件实现思路和架构设计方案 基础组件封装设计 - 迅速消息发送 基础组件封装设计 - 确认...

  • Vue 使用第三方JS库

    组件封装基础 实现步骤: 相关代码 views/count-to.vue components/index.js ...

  • Python数据结构-栈、队列

    由于 Python 基础数据类型封装得比较强大,实现栈和队列显得很容易 Python 实现栈 Python 实现队...

  • Java基础教程之实现接口

    Java基础教程之实现接口 在封装与接口中,private关键字封装了对象的内部成员。经过封装,产品隐藏了内部细节...

  • 设计模式要点

    OO指面向对象 OO基础 抽象 封装 多态 继承 OO原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现...

  • 计算机网络学习笔记(4) TCP/IP协议栈

    跨域交互的基础就是数据封装,数据封装和解封是由网卡和绑定的协议栈来实现的。 为什么需要封装? 什么是TCP/IP协...

  • 面向对象

    基础 抽象 封装 多态 继承 原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程 为交互对象之间的松...

  • 面向对象设计基础&原则

    面向对象设计基础 抽象 封装 继承 多态 面向对象设计原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程

网友评论

      本文标题:封装tree-基础实现

      本文链接:https://www.haomeiwen.com/subject/khvioctx.html