Vue3+TS+Element-Plus+el-tree创建树节点

1、一级树

应用效果:

代码:MaterialCategory.vue

<script setup lang="ts" name="MaterialCategory">
......
// 创建树(一级树)
const createTree = (dataList: IMaterialCategory[]) => {// 将原始数据转换成树节点数据let data: IMaterialCategoryTree[] = dataList.map((item) => {return {label: item.categoryName,value: item.categoryNo};});// 添加根节点treeData.value.push({label: "物资分类",value: "",children: data});
};
......
</script><template><el-container class="layout-container"><el-aside class="aside"><el-scrollbar><el-treeclass="tree-horizontal-scrollbar":data="treeData":default-expand-all="true":highlight-current="true":expand-on-click-node="false":indent="15"@node-click="onTreeNodeClick"><!-- 自定义节点内容,点击的节点字体变色加粗 --><!-- 动态样式:通过<template #default>插槽自定义节点内容,使用:style绑定根据当前选择的节点值currentNode.value动态设置color和fontWeight --><template #default="{ node, data }"><span:style="{color: currentNode?.value === data.value ? `#409EFF` : `#606266`,fontWeight: currentNode?.value === data.value ? `bold` : `normal`}">{{ node.label }}</span></template></el-tree></el-scrollbar></el-aside>......</el-container>
</template>

2、二级树

应用效果1:

代码2:MaterialInfo.vue

<script setup lang="ts" name="MaterialInfo">
......
// 创建树
const createTree = (dataList: IMaterialCategory[]) => {// 将原始数据转换成树节点数据let data: IMaterialCategoryTree[] = dataList.map((item) => {return {label: item.categoryName,value: item.categoryNo};});// 遍历物资类别列表,过滤出一级节点数据let data1 = data.filter((item) => {if (item.value.length === 2) return item;});// 遍历物资类别列表,过滤出二级节点数据let data2 = data.filter((item) => {if (item.value.length === 4) return item;});// 将一级节点数据与二级节点数据组合成树节点数据let dataChild = data1.map((item1) => {// 遍历二级节点数据,过滤出对应一级节点的数据let dataChild2 = data2.filter((item2) => {if (item2.value.substring(0, 2) === item1.value) return item2;});return {label: item1.label,value: item1.value,children: dataChild2};});// 添加根节点treeData.value.push({label: "物资分类",value: "",children: dataChild});
};
......
</script><template><el-container class="layout-container"><el-aside class="aside"><el-scrollbar><el-treeclass="tree-horizontal-scrollbar":data="treeData":default-expand-all="true":highlight-current="true":expand-on-click-node="false":indent="15"@node-click="onTreeNodeClick"><!-- 自定义节点内容,点击的节点字体变色加粗 --><!-- 动态样式:通过<template #default>插槽自定义节点内容,使用:style绑定根据当前选择的节点值currentNode.value动态设置color和fontWeight --><template #default="{ node, data }"><span:style="{color: currentNode?.value === data.value ? `#409EFF` : `#606266`,fontWeight: currentNode?.value === data.value ? `bold` : `normal`}">{{ node.label }}</span></template></el-tree></el-scrollbar></el-aside>......</el-container>
</template><style scoped lang="scss">
// 树节点
:deep(.el-tree-node__content) {height: 32px;
}
// 树节点展开图标
:deep(.el-tree-node__content > .el-tree-node__expand-icon) {padding: 0;
}
</style>

应用效果2:

代码2:LedgerDetail.vue

<script setup lang="ts" name="Ledger">
......
import { useMaterialCategoryTree } from "@/hooks/useMaterialCategoryTree";// 物资分类树 hook
const { materialCategoryTreeData, defaultProps } = useMaterialCategoryTree();
......
</script><template><el-container class="layout-container"><el-aside class="aside"><el-scrollbar><el-treeclass="tree-horizontal-scrollbar"ref="materialCategoryTreeRef":data="materialCategoryTreeData"node-key="value":show-checkbox="true":highlight-current="true":default-expand-all="true":check-on-click-node="true":expand-on-click-node="false":props="defaultProps"@check="handleCheck" /></el-scrollbar></el-aside>......</el-container>
</template><style scoped lang="scss">
// 树节点
:deep(.el-tree-node__content) {height: 32px;
}
// 树节点展开图标
:deep(.el-tree-node__content > .el-tree-node__expand-icon) {padding: 0;
}
</style>

物资分类树 hook:useMaterialCategoryTree.ts

import { onMounted, ref } from "vue";
import type { IMaterialCategory, IMaterialCategoryTree } from "@/views/warehouse/types";
import { materialCategoryService } from "@/api/warehouse";/*** 物资分类树 hook* @returns*/
export const useMaterialCategoryTree = () => {// 物资分类列表数据const materialCategoryListData = ref<IMaterialCategory[]>([]);// 物资分类树数据const materialCategoryTreeData = ref<IMaterialCategoryTree[]>([]);const defaultProps = {children: "children",label: "label"};// 获取物资分类列表数据const fetchMaterialCategoryListData = async () => {// 获取物资分类列表数据let result = await materialCategoryService();materialCategoryListData.value = result.data;};// 创建物资分类树数据const createMaterialCategoryTreeData = (dataList: IMaterialCategory[]) => {// 将原始数据转换成树节点数据let data: IMaterialCategoryTree[] = dataList.map((item) => {return {label: item.categoryName,value: item.categoryNo};});// 遍历物资分类列表数据,过滤出一级节点数据let data1 = data.filter((item) => {if (item.value.length === 2) return item;});// 遍历物资分类列表数据,过滤出二级节点数据let data2 = data.filter((item) => {if (item.value.length === 4) return item;});// 将一级节点数据与二级节点数据组合成树节点数据let dataChild = data1.map((item1) => {// 遍历二级节点数据,过滤出对应一级节点的数据let dataChild2 = data2.filter((item2) => {if (item2.value.substring(0, 2) === item1.value) return item2;});return {label: item1.label,value: item1.value,children: dataChild2};});// 添加根节点materialCategoryTreeData.value.push({label: "物资分类",value: "",children: dataChild});};onMounted(async () => {// 获取物资分类列表数据await fetchMaterialCategoryListData();// 创建物资分类树数据createMaterialCategoryTreeData(materialCategoryListData.value);});return { materialCategoryTreeData, defaultProps };
};

3、并级树

应用效果:

代码:QualityFileCategoryTree.vue

<script setup lang="ts" name="QualityFileCategoryTree">
......
// 创建树
const createTree = async (dataList: IFileCategory[]) => {// 文件小类列表(对象数组),数据可能会有重复let smallCategoryList = dataList.filter((item) => item.smallCategoryNo && item.smallCategoryName).map((item) => {return {smallCategoryNo: item.smallCategoryNo!,smallCategoryName: item.smallCategoryName!};});// 对象数组去重,通过对象所有属性值都相同去重,使用 JSON 序列化与 Set(适用扁平对象,简单高效)smallCategoryList = deduplicateObjectArray(smallCategoryList);// 遍历文件小类列表,将原始数据转换成树节点数据treeData.value = smallCategoryList.map((item1) => {// 链式调用,.filter().map().filter()return {value: item1.smallCategoryNo,label: item1.smallCategoryName,children: dataList// 过滤出对应一级节点的二级节点数据(文件细类).filter((item2) => item2.smallCategoryNo === item1.smallCategoryNo)// 将文件细类数据转换为树节点数据.map((item) => ({value: item.detailCategoryNo as string,label: item.detailCategoryName as string}))// 过滤出有效的数据(value 和 label 值不为空).filter((item) => item.value && item.label)};});
};
......
</script setup lang="ts"><template><el-scrollbar><!-- el-scrollbar 显示横向滚动条 --><div class="scroll-container"><el-treeref="treeRef":data="treeData"node-key="value":default-expand-all="true":highlight-current="true":expand-on-click-node="false":indent="15"@node-click="onTreeNodeClick"><!-- 自定义节点内容,点击的节点字体变色加粗 --><!-- 动态样式:通过<template #default>插槽自定义节点内容,使用:style绑定根据当前选择的节点值currentNode.value动态设置color和fontWeight --><template #default="{ node, data }"><span:style="{color: currentNode?.value === data.value ? `#409EFF` : `#606266`,fontWeight: currentNode?.value === data.value ? `bold` : `normal`}">{{ node.label }}</span></template></el-tree></div></el-scrollbar>
</template><style scoped lang="scss">
// el-scrollbar 显示横向滚动条
.scroll-container {display: flex;width: max-content;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920581.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++基础(④链表反转(链表 + 迭代 / 递归))

链表反转&#xff08;链表 迭代 / 递归&#xff09; 题目描述&#xff1a;给你单链表的头节点 head&#xff0c;请你反转链表&#xff0c;并返回反转后的链表头节点。 示例&#xff1a;输入链表 1→2→3→4→5 → 输出 5→4→3→2→1。 思路提示&#xff1a;迭代法&#xff1a…

面向企业级产品开发的自动化脚本实战

引言&#xff1a; 在产品开发团队中&#xff0c;设计师、产品经理和工程师之间的协作常常伴随着大量重复性工作&#xff1a;手动整理设计稿链接、更新产品需求文档、同步项目状态...这些工作不仅耗时&#xff0c;还容易出错。本文将带你编写一个Python脚本&#xff0c;自动化这…

科技赋能生态,智慧守护农林,汇岭生态开启农林产业现代化新篇章

在我国&#xff0c;农林业作为国民经济的基础产业&#xff0c;不仅关乎国家粮食安全与生态平衡&#xff0c;更是乡村振兴战略实施的核心领域。近年来&#xff0c;国家高度重视“三农”问题&#xff0c;大力推进乡村振兴战略&#xff0c;强调要实现农业农村现代化&#xff0c;促…

贪心算法面试常见问题分类解析

一、贪心算法问题 1. 跳跃游戏系列 能否到达终点: def canJump(nums):max_reach = 0for i in range(len(nums)):if i > max_reach:return Falsemax_reach = max(max_reach, i + nums[i])return True 最少步数: def jump(nums):jumps = end = max_pos = 0for i in range(l…

【3D入门-指标篇上】3D 网格重建评估指标详解与通俗比喻

一、指标对比表格指标名称核心定义计算关键步骤通俗比喻典型应用场景Chamfer距离双向平均几何距离采样点→计算最近邻距离→取平均沙滩沙粒的平均距离差评估服装轮廓、褶皱的细微差异法向量一致性表面法向量方向匹配度计算法向量点积→取绝对值→平均刺猬刺的朝向一致程度评估布…

补题报告08

题目背景某天&#xff0c;奇异博士在纽约圣所研究维山帝之书时&#xff0c;发现了连接不同多元宇宙的传送门网络......题目描述经研究&#xff0c;奇异博士发现每个传送门都有固定的 “时间代价”—— 正数表示双向通行&#xff08;往返时间代价相同均为正值&#xff09;&#…

马斯克杀入AI编程!xAI新模型Grok Code Fast 1发布,深度评测:速度、价格与API上手指南

AI 编程的赛道&#xff0c;又迎来一位重量级玩家——马斯克的 xAI。 就在最近&#xff0c;xAI 悄然发布了一款专为编码而生的新模型&#xff1a;Grok Code Fast 1。这款模型最初以代号“Sonic”在内部流传&#xff0c;如今正式亮相&#xff0c;便凭借其 256K 超长上下文、惊人的…

GaussDB 数据库架构师修炼(十八) SQL引擎-计划管理-SPM

1 背景由于业务数据的变化或者数据库版本的升级&#xff0c;可能导致SQL的执行计划发生变化&#xff0c;这种变化不一定是正收益&#xff0c;这时需 要一个防止计划劣化的机制。该机制需适用于版本升级时固化计划防止计划跳变等场景。2 SPM 的功能SPM(SQL Plan Manager)功能&a…

数字IC前端设计——前仿篇(VCS,DVE,Verdi)

文章目录引言一、软件介绍1. VCS2. DVE3. Verdi二、VCS的使用1. VCS的编译流程2. 常用的编译选项1&#xff09;基础编译选项2&#xff09;调试相关选项3&#xff09;性能优化选项4&#xff09;文件和路径选项3. 常用仿真选项1&#xff09;基础仿真选项2&#xff09;运行控制选项…

20250826--inter

一、非对称加密的应用 非对称加密应用-CSDN博客 2、怎么避免跨站脚本攻击&#xff0c;包括还有其他的一些web安全&#xff0c;怎么做的 网页安全XSS攻击和CSRF攻击_csrf共计-CSDN博客 3、前端异常监控&#xff0c;性能监控&#xff0c;埋点&#xff0c;怎么做的 &#xff1f…

MongoDB Shell

MongoDB官方提供的单独命令行工具 MongoDB Shell Download | MongoDB 下载MongoDB Shell windows系统打开&#xff0c;直接在解压后的目录里面找到bin目录 然后双击打开mongosh.exe这个文件 看到这个命令行就表示Mongo Shell已经启动成功了 test代表 当前正在使用的数据库的…

Docker03-知识点整理

Docker03-知识点整理 文章目录Docker03-知识点整理1-参考网址2-知识整理2-思考题1-Docker image和Docker Native image有什么区别1. Docker Image&#xff08;Docker 镜像&#xff09;定义特点构建和使用示例2. Docker Native Image&#xff08;通常指 GraalVM Native Image 结…

华为 eNSP 从入门到精通:企业级网络仿真全攻略

一、eNSP 简介华为 eNSP&#xff08;Enterprise Network Simulation Platform &#xff09;是面向企业网络的虚拟化仿真平台&#xff0c;其核心架构基于分布式虚拟化引擎和真实设备镜像&#xff0c;具备以下技术亮点&#xff1a;高度仿真&#xff1a;可模拟华为 AR 路由器、x7 …

docker compose设置命令别名的方法

docker compose名字比较长&#xff0c;输入比较费事&#xff0c;可以为它设置别名来简化输入。1、Linux编辑~/.bash_aliasesalias dcdocker-compse编辑~/.bashrc&#xff0c;确认其包含以下内容&#xff1a;if [ -f ~/.bash_aliases ]; then. ~/.bash_aliasesfi重新加载 ~/.bas…

【RAGFlow代码详解-10】文本处理和查询处理

概述 文本处理和查询处理系统将自然语言查询转换为与 RAGFlow 的文档存储后端配合使用的优化搜索表达式。该系统支持中英文文本处理&#xff0c;具有专门的标记化、术语加权和查询增强技术。核心组件 FulltextQueryer 类 FulltextQueryer 类是查询处理和文本分析的主要接口。它…

利用机器学习优化Backtrader策略原理与实践

1. Backtrader框架概述 1.1 Backtrader简介 Backtrader是一个功能强大且灵活的Python库&#xff0c;专为量化交易策略的开发、测试和执行而设计。它提供了丰富的功能&#xff0c;包括数据获取、策略开发、回测、优化和绘图等。Backtrader的核心优势在于其模块化设计和高度可扩展…

CPTS-Pressed复现(XML-RPC)

该box主要是了解wordpress-XML-RPC 的使用 端口扫描只有80端口开启 可以使用wpscan进行扫描发现bak文件得到凭证&#xff0c;尝试登陆&#xff08;这里是将原密码的2021修改为2022尝试登陆&#xff0c;该主机发布时间为2022年&#xff09;发现有2FA&#xff0c;但是能够滥用 xm…

【机器学习深度学习】Embedding 与 RAG:让 AI 更“聪明”的秘密

目录 前言 一、RAG 的两大阶段 1. 知识库构建阶段 2. 查询检索与生成阶段 二、为什么 RAG 比单纯大模型更靠谱&#xff1f; 四、Embedding 在 RAG 中的作用 五、Embedding 的优势 六、Embedding 的挑战 七、RAG 优势与挑战对比 八、应用场景举例 总结 前言 在大模型…

python 转偶数

目录 python变量转偶数 box转偶数 python变量转偶数 x1 int(x1) // 2 * 2 y1 int(y1) // 2 * 2 x2 int(x2) // 2 * 2 y2 int(y2) // 2 * 2 box转偶数 def save_mp4(output_path,box_list,img_list,clip_start,clip_end):writer imageio.get_writer(output_path,fps30,c…

Linux - 中文显示乱码问题解决方法(编码查看及转换)- 学习/实践

1.应用场景 主要用于Linux中文显示乱码问题解决(编码查看及转换&#xff09; 2.学习/操作 1.文档阅读 Linux中文显示乱码问题解决方法(编码查看及转换&#xff09; - 整合侠 - 博客园 截图&#xff1a; 2.整理输出 TBD 后续补充 ... 3.问题/补充 TBD 后续补充 ...…