高级组件封装技巧--tree的封装

el-tree是一个经常用到的组件,但是它不支持v-model,使用起来很麻烦,这篇教程封装了el-tree,使得它使用起来很简单,并且支持搜索,支持叶子节点横向排列,这样就算数据多了,也会显的很紧凑,同时它支持提交halfCheck节点,这点在做菜单管理的时候很有用,如果数据中不保存halfCheck,你需要向上遍历父节点,但是保存了父节点在回显的时候会有问题,因为只要父节点选中子节点都会选中,这些在组件封装中都做了处理

组件的封装 

<template><div><el-input v-model="filterText" placeholder="请输入搜索条件" v-if="filter" clearable/><el-tree v-bind="allProps" ref="treeRef" :filter-node-method="filterNode"@check="handleCheck"/></div>
</template><script lang="ts">
// @ts-nocheck
export default {name: "ui-tree",props: { // 参考 https://element-plus.org/zh-CN/component/tree.html#%E5%B1%9E%E6%80%A7modelValue: {default: () => []}, //要提交的表单值nodeKey: {default: 'id'}, //每个树节点用来作为唯一标识的属性,整棵树应该是唯一的defaultExpandAll: {default: true}, //是否默认展开所有节点showCheckbox: {default: true}, //是否显示选择框data: {default: null}, //树的数据filter: {default: true}, //是否显示过滤框leafInline: {default: true}, //叶子节点是否显示成一行props: { //参考:https://element-plus.org/zh-CN/component/tree.html#propstype: Object, default: () => {return {}}}},data() {return {textValue: '', //view模式显示的内容userChecked: false, //是否用户引起的变化filterText: '',allProps: {...this.$attrs,...this.$props}}},created() {if (this.leafInline) {this.props.class = this.customNodeClass}},mounted() {this.setChecked()},watch: {'modelValue': {handler(val) {this.setChecked()},},// 过滤filterText(val) {this.$refs.treeRef.filter(val)},},computed: {labelField() {if (!this.props || !this.props.label) return 'label'return this.props.label},childrenField() {if (!this.props || !this.props.children) return 'children'return this.props.children},},methods: {// 设置选中的节点setChecked() {let val = this.modelValue//如果是用户点击则不设置if (this.userChecked) {this.userChecked = falsereturn}if (!val || !this.$refs.treeRef) returnlet leafNode = []// 如果后台保存了half节点,需要过滤掉this.filterLeafNode(leafNode, this.data, val)this.$refs.treeRef.setCheckedKeys(leafNode)},//用户选择后回调handleCheck(data, check) {this.updateModelValue(check.halfCheckedKeys, check.checkedKeys)},updateModelValue(halfCheckedKeys, checkedKeys) {this.userChecked = truelet checkIds = []checkIds.push(...halfCheckedKeys)checkIds.push(...checkedKeys)this.$emit('update:modelValue', checkIds)},//根据搜索框过滤节点filterNode(value: string, data) {// 该方法会遍历所有节点,显示返回为true的节点if (!value) return truereturn data[this.labelField].includes(value)},// 过滤父节点,只返回叶子节点filterLeafNode(leafNode, children, checkedArray) {if (!children) return []children.forEach(item => {if (!item[this.childrenField] || item[this.childrenField].length == 0) {if (checkedArray.indexOf(item[this.nodeKey]) > -1) {leafNode.push(item[this.nodeKey])}} else {this.filterLeafNode(leafNode, item[this.childrenField], checkedArray)}})},customNodeClass(data, node) {if (node.isLeaf) return ''let addClass = truefor (const key in node.childNodes) {if (!node.childNodes[key].isLeaf) {addClass = false}}let levelClass = 'level-' + node.levelreturn addClass ? `penultimate-node ${levelClass}` : ''},}
}
</script><style>
.penultimate-node .el-tree-node__children {line-height: 12px;
}.el-tree-node.penultimate-node > .el-tree-node__children {display: flex;flex-direction: row;flex-wrap: wrap;
}.el-tree-node.penultimate-node.level-1 > .el-tree-node__children {padding-left: 30px;
}
.el-tree-node.penultimate-node.level-2 > .el-tree-node__children {padding-left: 48px;
}
.el-tree-node.penultimate-node.level-3 > .el-tree-node__children {padding-left: 64px;
}
.el-tree-node.penultimate-node.level-4 > .el-tree-node__children {padding-left: 84px;
}.penultimate-node .el-tree-node__children > .el-tree-node .el-tree-node__content {padding-left: 12px !important;
}.penultimate-node .el-tree-node__children .el-tree-node__content .el-tree-node__expand-icon {display: none;
}
</style>

组件的使用

node-key就是绑定值,如果要form绑定id就传id,组件默认显示label,子节点保存在children里面,如果要变更可以通过:props="{label:'title',children:'children'}"来实现

<template><div style="width: 400px"><ui-tree :data="data" node-key="label" v-model="form"></ui-tree></div>
</template><script>
import UiTree from "@/components/ui-tree.vue";
export default {name: "tree",components: {UiTree},data() {return {form: ['菜单管理'],data: [{label: '系统管理',children:[{label:'用户管理', children:[{label:'菜单管理'},{label:'按钮管理'},{label:'权限管理'}]},{label:'角色管理'}]},{label:'文档管理',children:[{label:'目录管理'},{label:'图片管理'},{label:'文件管理'}]}]}},
}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计 二手闲置交易系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

线性表之双向链表

1. 双向链表的结构 对于单向链表和单向循环链表而言有一个共同的特点&#xff0c;就是链表的每个节点都只有一个指向后继节点的指针&#xff0c;通过这个指针我们就可以从前往后完成对链表的遍历。但是开弓没有回头箭&#xff0c;遍历到尾节点之后再想要回到头结点&#xff0c…

Python(TensorFlow)和MATLAB及Java光学像差导图

&#x1f3af;要点 几何光线和波前像差计算入瞳和出瞳及近轴光学计算波前像差特征矩阵方法计算光谱反射率、透射率和吸光度透镜像差和绘制三阶光线像差图和横向剪切干涉图分析瞳孔平面焦平面和大气湍流建模神经网络光学像差计算透镜光线传播几何偏差计算像差和像散色差纠正对齐…

lambda表达式用法——C#学习笔记

“Lambda 表达式”是一个匿名函数&#xff0c;它可以包含表达式和语句&#xff0c;并且可用于创建委托或表达式目录树类型。 实例如下&#xff1a; 代码如下&#xff1a; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.…

表连接查询之两个left join与递归SQL

一、如下SQL1 SELECT i.*,su1.name as createName,su2.name as updateNameFROM information ileft join sys_user su1 on su1.idi.create_idleft join sys_user su2 on su2.idi.update_id 二、分析 1、SELECT i.*,su.name as createName,sua.name as updateName&#xff1a; 这…

负载均衡 Ribbon 与 Fegin 远程调用原理

文章目录 一、什么是负载均衡二、Ribbon 负载均衡2.1 Ribbon 使用2.2 Ribbon 实现原理 (★)2.3 Ribbon 负载均衡算法 三、Feign 远程调用3.1 Feign 简述3.2 Feign 的集成3.3 Feign 实现原理 (★) 一、什么是负载均衡 《服务治理&#xff1a;Nacos 注册中心》 末尾提到了负载均…

污点、容忍、不可调度、排水、数据卷

目录 污点taint 污点的格式 1. key:effect 键名&#xff1a;污点类型 2. keyvalue:effect 键名数值&#xff1a;污点类型 污点的类型 1. NoSchedule 2. PreferNoSchedule 3. NoExecute&#xff08;驱逐&#xff09; 设置污点&#xff08;主节点操作&#xff09…

[论文笔记]大模型微调数据配比策略

大模型微调数据配比策略 How Abilities in Large Language Models are Affected by Supervised Fine-tuning Data Composition https://arxiv.org/pdf/2310.05492 一、背景&#xff1a; 大模型是无监督的多任务学习器&#xff0c;其强大的泛化能力可以同时理解并执行多种任务…

PointNet++改进策略 :模块改进 | PAConv,位置自适应卷积提升精度

题目&#xff1a;PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds来源&#xff1a;CVPR2021机构&#xff1a;香港大学论文&#xff1a;https://arxiv.org/abs/2103.14635代码&#xff1a;https://github.com/CVMI-Lab/PAConv 前言 PA…

elasticsearch文档Delete By Query API(一)

这里的查询需要使用和Search API&#xff08;后文会讲&#xff09;相同的方式来将查询条件作为query的值传递&#xff0c;当然也可以使用q关键字&#xff0c;例如如下请求&#xff1a; curl -X POST “localhost:9200/twitter/_delete_by_query?pretty&quser:kimchy” -H…

HTTP 二、进阶

四、安全 1、TLS是什么 &#xff08;1&#xff09;为什么要有HTTPS ​ 简单的回答是“因为 HTTP 不安全”。由于 HTTP 天生“明文”的特点&#xff0c;整个传输过程完全透明&#xff0c;任何人都能够在链路中截获、修改或者伪造请求 / 响应报文&#xff0c;数据不具有可…

log4j 清除MDC上下文 MDC分类日志

在项目里需要分类收集处理日志信息&#xff0c;使用 log4j的MDC在线程中添加分类信息。不过最近却出现日志信息记录错误的情况&#xff0c;具体来说&#xff0c;就是会出现本来是属于下一个分类的一部分信息莫名的记录到上一个分类的日志文件中了。这很显然是MDC信息错误造成的…

【2024 CCF编程能力等级认证(GESP)Python 】一级大纲

目录 1. 背景2. 考核知识块3. 考核内容3.1 计算机基础知识3.2 编程规范3.3 基础语法3.4 数据类型3.5 三大基本结构3.6 运算符3.7 模块导入与输入输出3.8 Turtle绘图4. 考核目标5. 题型分布6. 考试时长7. 认证时间与报名8. 政策与福利9. GESP一级认证形式 1. 背景 官网&#xff…

[UVM]3.核心基类 uvm_object 域的自动化 copy() compare() print() pack unpack

1.核心基类&#xff1a;uvm_object &#xff08;1&#xff09;虚类只能声明&#xff0c;不能例化。 &#xff08;2&#xff09;uvm_object提供的方法 2.域的自动化&#xff08;field automation&#xff09; &#xff08;1&#xff09;简述 &#xff08;2&#xff09;示例 格…

php、Java、python酒店预约与送餐系统 酒店管理系统 酒店预订入住系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

C++系统教程001

1. 安装 Dev-C编程软件 2. 熟悉 Dev-C的界面 3. cout 输出语句的使用 4. 学会 C程序的编译运 一、认识编译器 我们平时所说的程序&#xff0c;一般指双击后就可以直接运行的程序&#xff0c;这样的程序又称为可执行程序。Windows系统下&#xff0c;可执行程序的后缀一般为.ex…

The Llama 3 Herd of Models【论文原文下载】

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 The Llama 3 Herd of Models【论文原文】 点击下载&#xff1a;原文下载链接 摘要 现代人工智能&#xff08;AI&#xff09;系统由基础模型驱动。本文介绍了一组新的基础模型&#xff0c;称为 Llama 3。它是…

PostgreSQL的repmgr工具介绍

PostgreSQL的repmgr工具介绍 repmgr&#xff08;Replication Manager&#xff09;是一个专为 PostgreSQL 设计的开源工具&#xff0c;用于管理和监控 PostgreSQL 的流复制及实现高可用性。它提供了一组工具和实用程序&#xff0c;简化了 PostgreSQL 复制集群的配置、维护和故障…

欺诈文本分类检测(十):QLora量化微调

1. 引言 前文微调方法概览总结了微调的各种方法&#xff0c;并且在更前面两篇文章Lora单卡训练 和 lora单卡二次调优中已经尝试过用Lora进行微调&#xff0c;本文出于好奇准备尝试下用QLora进行微调的效果。 QLoRA是一种新的微调大型语言模型&#xff08;LLM&#xff09;的方…

使用Python的Elasticsearch客户端 elasticsearch-py 来完成删除现有索引、重新创建索引并测试分词的示例代码

以下是一个使用Python的Elasticsearch客户端 elasticsearch-py 来完成删除现有索引、重新创建索引并测试分词的示例代码 一、安装依赖 pip install elasticsearch二、运行效果 三、程序代码 from elasticsearch import Elasticsearch, NotFoundError# 连接到Elasticsearch es…