仿写练习树形目录

半成功

<template>
    <div>
        <el-tree  ref="tree" :load="loadNode" :props="defaultProps" current-node-key="1" node-key="id" lazy

            @node-click="nodeClick" :default-expand-all = false>
            <div class="custom-tree-node" slot-scope="{ node, data}">
                <div>
                    <!-- 没有子元素时显示的图标 (即是最后一层) -->
                    <span v-if="!data.children || data.id == '0'">
                        <i class="el-icon-document" style="color: #fd7575"></i>
                    </span>
                    <!-- 有子元素显示的图标 -->
                    <span v-else>
                        <!-- 这里的展开的显示隐藏即是 [+] [-] 因为这个是图片所以可能会报错  可以随意使用一个icon这图标替换 -->
                        <img :src="data.open ? defaultOpen : defaultClose" alt />
                        <!-- 这里文件打开和关闭图标的切换  -->
                        <i :class="data.open ? 'el-icon-folder-opened' : 'el-icon-folder'" style="color: #448ac4"></i>
                    </span>
                    <!-- 名称 -->
                    <span>{{ node.label }}</span>
                </div>
            </div>
        </el-tree>
        <div>B结束</div>
    </div>
</template>

<script>
export default {
    name: 'MyItem',

    data() {
        return {
            defaultOpen: require("@/assets/common_images/20200713152347772.png"),
            defaultClose: require("@/assets/common_images/20200713152347785.png"),
            defaultProps: {
                children: 'children',
                label: 'label'
            },
            props: {
                label: 'label',
            },
            allTreeData:  [
                {
                    level: 0,
                    id: 1,
                    label: "我的调研",
                    open: true,
                    leaf: false,
                    children: [
                        {
                            id: 2,
                            level: 1,
                            label: "基础信息",
                        }
                    ]
                },
                {
                    id: 3,
                    level: 0,
                    label: "一级 3",
                    open: true,
                    children: [
                        {
                            id: 4,
                            level: 1,
                            label: "二级 3-1"
                        },
                        {
                            id: 5,
                            level: 1,
                            label: "二级 3-2"
                        }
                    ]
                },
                {
                    id: 6,
                    level: 0,
                    label: "我的调研",
                    open: true,
                    children: [
                        {
                            id: 7,
                            level: 1,
                            label: "基础信息xx",
                            open: true,
                            children: [
                                {
                                    id: 8,
                                    level: 2,
                                    label: "基础信息hh",
                                    open: true,
                                    children: [
                                        {
                                            id: 9,
                                            level: 3,
                                            label: "基础信息cc",
                                            open: true,
                                            children: [

                                                { id: 10, level: 4, label: "基础信息uux" }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ], // 用来存储后端返回的全部树节点数据
            treeData:[]
        }
    },
    methods: {
        nodeClick(data) {
            data.open = !data.open;
        },
        test() {
            console.log(this.data);
        },
        loadNode(node, resolve) {

            if (node.level === 0) {
                let temp = this.filterNodesByLevel(this.allTreeData, 0);
                return resolve(temp);
            }
            console.log(!node.data.children);
            if (!node.data.children) {
                return resolve([]);
            }
            setTimeout(() => {
                console.log("=-=-");
                let temp = this.filterNodesByLevel(node.data.children, node.level);
                console.log(temp);
                const data = temp;

                resolve(data);
            }, 500);
        },
        filterNodesByLevel(nodes, level, result = []) {
            for (const node of nodes) {
                if (node.level === level) {
                    result.push(node);
                }
                if (node.children && node.children.length > 0) {
                    this.filterNodesByLevel(node.children, level, result);
                }
            }
            return result;
        }
    }
}
</script>

<style>
.el-tree-node {
    position: relative;
    padding-left: 10px;
}

.el-tree-node__children {
    padding-left: 10px;
}

.el-tree-node:last-child:before {
    height: 40px;
}

.el-tree>.el-tree-node:before {
    border-left: none;
}

.el-tree>.el-tree-node:after {
    border-top: none;
}

.el-tree-node:before,
.el-tree-node:after {
    content: "";
    left: -4px;
    position: absolute;
    right: auto;
    border-width: 1px;
}

.tree:first-child .el-tree-node:before {
    border-left: none;
}

.el-tree-node:before {
    border-left: 1px solid #e3e3e3;
    bottom: 0px;
    height: 100%;
    top: -25px;
    width: 1px;
}

.el-tree-node:after {
    border-top: 1px solid #e3e3e3;
    height: 20px;
    top: 14px;
    width: 24px;
}

.el-tree-node__expand-icon.is-leaf {
    width: 8px;
}

.el-tree-node__content>.el-tree-node__expand-icon {
    display: none;
}

.el-tree-node__content {
    line-height: 30px;
    height: 30px;
}

.el-tree>div {
    &::before {
        display: none;
    }

    &::after {
        display: none;
    }
}
</style>

其他记录

<template>
    <div>
        <recycle-scroller class="virtual-list" :buffer="1000" :prerender="200" style="height: 800px" :item-size="100"
            key-field="id" :items="tree">
            <template>
                <MyItem :data="tableData"></MyItem>
            </template>
        </recycle-scroller>
    </div>
</template>

<script>
import MyItem from './MyItem.vue';
export default {
    name: "MyComponentPage",
    components: {
        MyItem: MyItem
    },
    data() {
        return {
            tableData: [],
            tree: [{id:1,name:"xxx"}],
            num: 1,
            defaultProps: {
                children: 'children',
                label: 'label'
            }
        }
    },
    methods: {
        handleNodeClick(data) {
            console.log(data);
        },
        setIdToData(data) {
            // 辅助函数,用于递归设置ID
            function setIDs(item, currentId) {
                item.id = currentId++; // 设置当前项的ID
                if (item.children && item.children.length > 0) {
                    // 如果存在子项,递归调用设置子项的ID
                    item.children.forEach((child, index) => {
                        setIDs(child, currentId);
                        if (index < item.children.length - 1) {
                            currentId++; // 为下一个子项递增ID
                        }
                    });
                }
            }

            let startingId = this.num; // 传入的起始ID
            data.forEach((item, index) => {
                setIDs(item, startingId);
                if (index < data.length - 1) {
                    startingId++; // 为下一个顶层项递增ID
                }
            });
            this.num = startingId

        }
    },
    created() {
        const temp = [
            {
                id: 0 + this.num,
                label: "我的调研"+Date.now().toString(36),
                open: true,
                children: [
                    {
                        id: 9 + this.num,
                        label: "基础信息"+Date.now().toString(36)
                    }
                ]
            },
            {
                id: 1 + this.num,
                label: "一级 3"+Date.now().toString(36),
                open: true,
                children: [
                    {
                        id: 2 + this.num,
                        label: "二级 3-1"+Date.now().toString(36)
                    },
                    {
                        id: 3 + this.num,
                        label: "二级 3-2"+Date.now().toString(36)
                    }
                ]
            },
            {
                id: 4 + this.num,
                label: "我的调研"+Date.now().toString(36),
                open: true,
                children: [
                    {
                        id: 5 + this.num,
                        label: "基础信息"+Date.now().toString(36),
                        open: true,
                        children: [
                            {
                                id: 6 + this.num,
                                label: "基础信息"+Date.now().toString(36),
                                open: true,
                                children: [
                                    {
                                        id: 7 + this.num,
                                        label: "基础信息"+Date.now().toString(36),
                                        open: true,
                                        children: [
                                            { id: 8 + this.num, label: "基础信息"+Date.now().toString(36) }
                                        ]
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
        for (let i = 0; i < 1; i++) {
            this.num = i * 10
            //遍历添加
            temp.forEach(item => {
                this.tableData.push(item)
            })
        }
        console.log(this.tableData);

    }
}
</script>

<style></style>
<template>
    <div>
        <!-- <button @click="test">测试</button> -->
        <el-tree :data="data1" ref="tree" :load="loadNode" :props="defaultProps" current-node-key="1" node-key="id" lazy

            @node-click="nodeClick" default-expand-all>
            <div class="custom-tree-node" slot-scope="{ node, data}">
                <div>
                    <!-- 没有子元素时显示的图标 (即是最后一层) -->
                    <span v-if="!data.children || data.id == '0'">
                        <i class="el-icon-document" style="color: #fd7575"></i>
                    </span>
                    <!-- 有子元素显示的图标 -->
                    <span v-else>
                        <!-- 这里的展开的显示隐藏即是 [+] [-] 因为这个是图片所以可能会报错  可以随意使用一个icon这图标替换 -->
                        <img :src="data.open ? defaultOpen : defaultClose" alt />
                        <!-- 这里文件打开和关闭图标的切换  -->
                        <i :class="data.open ? 'el-icon-folder-opened' : 'el-icon-folder'" style="color: #448ac4"></i>
                    </span>
                    <!-- 名称 -->
                    <span>{{ node.label }}</span>
                </div>
            </div>
        </el-tree>
        <div>结束展示</div>
    </div>
</template>

<script>
export default {
    name: 'MyItem',

    data() {
        return {
            defaultOpen: require("@/assets/common_images/20200713152347772.png"),
            defaultClose: require("@/assets/common_images/20200713152347785.png"),
            defaultProps: {
                children: 'children',
                label: 'label'
            },
            data1: [
                {
                    "id": 1,
                    "label": "我的调研lxxgobc5",
                    "open": true,
                    "children": [
                        {
                            "id": 10,
                            "label": "基础信息lxxgobc5"
                        }
                    ]
                },
                {
                    "id": 2,
                    "label": "一级 3lxxgobc5",
                    "open": true,
                    "children": [
                        {
                            "id": 3,
                            "label": "二级 3-1lxxgobc5"
                        },
                        {
                            "id": 4,
                            "label": "二级 3-2lxxgobc5"
                        }
                    ]
                },
                {
                    "id": 5,
                    "label": "我的调研lxxgobc5",
                    "open": true,
                    "children": [
                        {
                            "id": 6,
                            "label": "基础信息lxxgobc5",
                            "open": true,
                            "children": [
                                {
                                    "id": 7,
                                    "label": "基础信息lxxgobc5",
                                    "open": true,
                                    "children": [
                                        {
                                            "id": 8,
                                            "label": "基础信息lxxgobc5",
                                            "open": true,
                                            "children": [
                                                {
                                                    "id": 9,
                                                    "label": "基础信息lxxgobc5"
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    },
    props: {
        data: {
            type: Array,
            default: () => { }
        }
    },
    methods: {
        nodeClick(data) {
            data.open = !data.open;
        },
        test() {
            console.log(this.data);
        },
        // loadNode(node, resolve) {
        //     console.log("触发了");
        //     if (node && node.data) {
        //         console.log(node);
        //         // 查找当前节点在allTreeData中的信息
        //         const currentNodeInAllData = this.allTreeData.find(item => item.id === node.data.id);
        //         console.log(currentNodeInAllData + "currentNodeInAllData");
        //         if (!currentNodeInAllData || currentNodeInAllData.leaf) {
        //             console.log("到这了lllllll");
        //             // 如果找不到节点或已经是叶子节点,则不加载更多
        //             resolve([]);
        //         } else {
        //             // 筛选当前节点的子节点
        //             console.log("到这了00000");
        //             const children = currentNodeInAllData.children || [];
        //             // 将子节点数据添加到当前显示的树数据中,并通知树组件更新
        //             this.treeData.push(...children);
        //             resolve(children);
        //         }
        //     } else {
        //         //说明是首次加载
        //         console.log("为空");
        //         console.log(this.filterNodesByLevel(this.allTreeData, 0));
        //         resolve(this.treeData);
        //     }


        // },
        loadNode(node, resolve) {
            if (node.level === 0) {
                let temp = this.filterNodesByLevel(this.allTreeData, 0);
                return resolve(temp);
            }
            console.log(!node.data.children);
            if (!node.data.children) {
                return resolve([]);
            }
            setTimeout(() => {
                console.log("=-=-");
                let temp = this.filterNodesByLevel(node.data.children, node.level);
                console.log(temp);
                const data = temp;

                resolve(data);
            }, 500);
        },

        // fetchAllTreeData() {
        //     // 假设这是从后端获取所有数据的方法
        //     // axios.get('/api/getAllTreeNodes')
        //     //     .then(response => {
        //     //         this.allTreeData = response.data;
        //     //         // 初始化时,可以先加载第一级节点
        //     //         this.treeData = this.filterNodesByLevel(this.allTreeData, 0);
        //     //     });
        //     // this.allTreeData = this.temp;
        //     // 初始化时,可以先加载第一级节点
        //     this.treeData = this.filterNodesByLevel(this.allTreeData, 0);
        // },
        filterNodesByLevel(nodes, level, result = []) {
            for (const node of nodes) {
                if (node.level === level) {
                    result.push(node);
                }
                if (node.children && node.children.length > 0) {
                    this.filterNodesByLevel(node.children, level, result);
                }
            }
            return result;
        }
    }
}
</script>

<style>
.el-tree-node {
    position: relative;
    padding-left: 10px;
}

.el-tree-node__children {
    padding-left: 10px;
}

.el-tree-node:last-child:before {
    height: 40px;
}

.el-tree>.el-tree-node:before {
    border-left: none;
}

.el-tree>.el-tree-node:after {
    border-top: none;
}

.el-tree-node:before,
.el-tree-node:after {
    content: "";
    left: -4px;
    position: absolute;
    right: auto;
    border-width: 1px;
}

.tree:first-child .el-tree-node:before {
    border-left: none;
}

.el-tree-node:before {
    border-left: 1px solid #e3e3e3;
    bottom: 0px;
    height: 100%;
    top: -25px;
    width: 1px;
}

.el-tree-node:after {
    border-top: 1px solid #e3e3e3;
    height: 20px;
    top: 14px;
    width: 24px;
}

.el-tree-node__expand-icon.is-leaf {
    width: 8px;
}

.el-tree-node__content>.el-tree-node__expand-icon {
    display: none;
}

.el-tree-node__content {
    line-height: 30px;
    height: 30px;
}

.el-tree>div {
    &::before {
        display: none;
    }

    &::after {
        display: none;
    }
}
</style>
<template>
    <el-tree :props="props" :load="loadNode" lazy show-checkbox>
    </el-tree>
</template>

<script>
export default {
    data() {
        return {
            props: {
                label: 'label',
                // children: 'zones',
                // isLeaf: 'leaf'
            },
            allTreeData: [
                {
                    level: 0,
                    id: 1,
                    label: "我的调研",
                    open: true,
                    leaf: false,
                    children: [
                        {
                            id: 2,
                            level: 1,
                            label: "基础信息",
                            children: []
                        }
                    ]
                },
                {
                    id: 3,
                    level: 0,
                    label: "一级 3",
                    open: true,
                    children: [
                        {
                            id: 4,
                            level: 1,
                            label: "二级 3-1"
                        },
                        {
                            id: 5,
                            level: 1,
                            label: "二级 3-2"
                        }
                    ]
                },
                {
                    id: 6,
                    level: 0,
                    label: "我的调研",
                    open: true,
                    children: [
                        {
                            id: 7,
                            level: 1,
                            label: "基础信息xx",
                            open: true,
                            children: [
                                {
                                    id: 8,
                                    level: 2,
                                    label: "基础信息hh",
                                    open: true,
                                    children: [
                                        {
                                            id: 9,
                                            level: 3,
                                            label: "基础信息cc",
                                            open: true,
                                            children: [

                                                { id: 10, level: 4, label: "基础信息uux" }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ], // 用来存储后端返回的全部树节点数据
            treeData: [], // 用来存储当前显示的树节点数据(初始为空)
        };
    },
    methods: {
        // loadNode(node, resolve) {
        //     console.log("触发了");
        //     if (node && node.data) {
        //         console.log(node);
        //         // 查找当前节点在allTreeData中的信息
        //         const currentNodeInAllData = this.allTreeData.find(item => item.id === node.data.id);
        //         console.log(currentNodeInAllData + "currentNodeInAllData");
        //         if (!currentNodeInAllData || currentNodeInAllData.leaf) {
        //             console.log("到这了lllllll");
        //             // 如果找不到节点或已经是叶子节点,则不加载更多
        //             resolve([]);
        //         } else {
        //             // 筛选当前节点的子节点
        //             console.log("到这了00000");
        //             const children = currentNodeInAllData.children || [];
        //             // 将子节点数据添加到当前显示的树数据中,并通知树组件更新
        //             this.treeData.push(...children);
        //             resolve(children);
        //         }
        //     } else {
        //         //说明是首次加载
        //         console.log("为空");
        //         console.log(this.filterNodesByLevel(this.allTreeData, 0));
        //         resolve(this.treeData);
        //     }


        // },
        loadNode(node, resolve) {
            if (node.level === 0) {
                let temp = this.filterNodesByLevel(this.allTreeData, 0);
                return resolve(temp);
            }
            console.log(!node.data.children);
            if (!node.data.children) {
                return resolve([]);
            }
            setTimeout(() => {
                console.log("=-=-");
                let temp = this.filterNodesByLevel(node.data.children, node.level);
                console.log(temp);
                const data = temp;

                resolve(data);
            }, 500);
        },

        // fetchAllTreeData() {
        //     // 假设这是从后端获取所有数据的方法
        //     // axios.get('/api/getAllTreeNodes')
        //     //     .then(response => {
        //     //         this.allTreeData = response.data;
        //     //         // 初始化时,可以先加载第一级节点
        //     //         this.treeData = this.filterNodesByLevel(this.allTreeData, 0);
        //     //     });
        //     // this.allTreeData = this.temp;
        //     // 初始化时,可以先加载第一级节点
        //     this.treeData = this.filterNodesByLevel(this.allTreeData, 0);
        // },
        filterNodesByLevel(nodes, level, result = []) {
            for (const node of nodes) {
                if (node.level === level) {
                    result.push(node);
                }
                if (node.children && node.children.length > 0) {
                    this.filterNodesByLevel(node.children, level, result);
                }
            }
            return result;
        }

    },
    mounted() {
        // this.fetchAllTreeData()
    }
};
</script>

<style></style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值