半成功
<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>