基于Element UI内置的Select下拉和Tree树形组件,组合封装的树状下拉选择器

目录

简述

效果

功能描述

代码实现

总结


简述

基于Element UI内置的Select下拉和Tree树形组件,组合封装的树状下拉选择器。

效果

先看效果:

下拉状态:

选择后状态:

选择的数据:

功能描述

1、加载树结构,实现树状下拉选择器; 

2、可通过关键词实现本地和远程过滤; 

3、高亮选择行; 

4、设置默认选择行; 

5、可直接应用在form表单;

代码实现

树状下拉组件代码:

<!--树状下拉选择框:1、加载树结构,实现树状下拉选择组件;2、可通过关键词实现本地和远程过滤;3、高亮选择行;4、设置默认选择行;5、可直接应用在form表单;
-->
<template><el-selectref="selectRef"clearablefilterable:remote="remote":remote-method="selectRemoteMethod"v-model="currentLabel"@visible-change="handleVisibleChange"@clear="handleClear"><el-optionstyle="height: 100%; padding: 0"value=""v-loading="loading"element-loading-text="加载中..."element-loading-spinner="el-icon-loading"><el-treeref="treeRef":data="dataOfTree":node-key="defaultProps.value":props="defaultProps"highlight-currentdefault-expand-all:current-node-key="selectedNode.value":expand-on-click-node="false"@node-click="handleNodeClicked":filter-node-method="filterNode"></el-tree></el-option></el-select>
</template>
<script>export default {name: 'SelectTree',components: {},model: {prop: 'inputValue',event: 'myInputEvent'},props: {// 默认选中值defaultValue: {type: Number},// 是否远程搜索remote: {type: Boolean,default: false},// 远程方法remoteMethod: {type: Function},treeOptions: {type: Array,default: () => {return []}},defaultProps: {type: Object,default: () => {return {children: 'children',label: 'label',value: 'value'}}}},watch: {treeOptions: {handler(newValue) {this.dataOfTree = JSON.parse(JSON.stringify(newValue))// 保留源数据;this.dataSource = JSON.parse(JSON.stringify(newValue))},deep: true,immediate: false},defaultValue: {handler(newValue) {this.selectedNode = {}this.currentLabel = undefinedthis.currentValue = newValuethis.$nextTick(() => {// 过滤方式是通过value还是label;this.isFilterWithValue = trueif (this.dataOfTree) {this.$refs.treeRef.filter(newValue)}})},deep: true,immediate: true}},data() {return {selectedNode: {},loading: false,currentValue: undefined,currentLabel: undefined,dataOfTree: []}},created() {this.dataOfTree = JSON.parse(JSON.stringify(this.treeOptions))// 保留源数据;this.dataSource = JSON.parse(JSON.stringify(this.treeOptions))},mounted() {},methods: {selectRemoteMethod(val) {this.isFilterWithValue = falseif (this.remote) {// 远程搜索this.remoteMethod(val)} else {// 本地过滤this.$refs.treeRef.filter(val)}},handleClear() {// 如果内容被清空this.selectedNode = {}this.currentLabel = undefinedthis.currentValue = undefinedconst result = this.buildEmptyResult()this.$emit('myInputEvent', result)this.$emit('onNodeSelectEvent', result)},handleVisibleChange(visible) {if (!visible) {// 先移除所有数据;this.dataOfTree.splice(0)// 恢复原来的所有数据;this.dataOfTree.splice(0, 0, ...this.dataSource)// 本地过滤this.$refs.treeRef.filter('')}},filterNode(value, data) {if (!value) {return data}if (this.isFilterWithValue) {if (data[this.defaultProps.value] === value) {this.selectedNode = datathis.currentLabel = data[this.defaultProps.label]this.$refs.treeRef.setCurrentKey(this.selectedNode[this.defaultProps.value])const result = this.buildResultByNodeData(data)this.$emit('myInputEvent', result)}} else {return data[this.defaultProps.label].indexOf(value) !== -1}return data},closeSelect() {this.$refs.selectRef.blur()},/*** @param data* @param node* @param comp*/handleNodeClicked(data, node, comp) {this.selectedNode = datathis.currentLabel = data[this.defaultProps.label]this.currentValue = data[this.defaultProps.value]const result = this.buildResultByNodeData(data)this.$emit('myInputEvent', result)this.$emit('onNodeSelectEvent', result)this.closeSelect()},buildResultByNodeData(data) {return {node: data[this.defaultProps.value],data: {label: data[this.defaultProps.label],value: data[this.defaultProps.value]},meta: data}},buildEmptyResult() {return {node: undefined,data: {label: undefined,value: undefined},meta: undefined}}}
}
</script><style lang='scss' scoped>
</style>

应用示例:

<template><div><div>测试表单</div><el-formref="demandFormRef":model="form"label-suffix=":"status-iconlabel-position="left"><el-form-item label="树" label-width="85px" prop="tree"><select-treev-model="form.tree":tree-options="treeOptions":default-value="form.tree.node"@onNodeSelectEvent="handleNodeSelectEvent($event)"/></el-form-item></el-form><div><el-button @click="reset">重置</el-button><el-button @click="submit">提交</el-button></div></div>
</template>
<script>
import {Message} from 'element-ui'
import SelectTree from '@/components/SelectTree/index'export default {components: {SelectTree},props: {},data() {return {form: {tree: {node: undefined, data: {}}},treeOptions: [{value: 1,label: '一级 1',children: [{value: 11,label: '二级 1-1',children: [{value: 111,label: '三级 1-1-1'}]}]}, {value: 2,label: '一级 2',children: [{value: 21,label: '二级 2-1'}]}, {value: 3,label: '一级 3',children: [{value: 31,label: '二级 3-1',children: [{value: 311,label: '三级 3-1-1'}]}, {value: 32,label: '二级 3-2',children: [{value: 321,label: '三级 3-2-1'}]}]}]}},mounted() {// 模拟接口请求,反显选择数据// setTimeout(() => {//   this.form.tree.node = 2// }, 1000)},methods: {reset() {this.form.tree = {node: undefined, data: {}}},submit() {const data = this.form.tree.dataMessage.info(`选中节点名称是${data.label},值是${data.value}`)},handleNodeSelectEvent(dataSelected){}}
}
</script><style lang='scss' scoped>
</style>

总结

本示例中,部分实现细节或者写法,可根据实际需要调整,树状下拉的实现方式有多种,这只是其中一种,只要符合实际需求就可以。

如果发现问题,欢迎随时提出,共同改进。

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

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

相关文章

FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 梳理下思路 1.判断是否登录 2.课程是否存在 3.如果是回复&#xff0c;查看回复是否存在 4.是否有权限 5.发起评论 首先新增pydantic模型 class Cour…

Git勤勉 两种方式上传

官网 勤勉Gitea 创建仓库 上传代码 可以先取个仓库名字 给个分支的名字就可以创建了 创建好了会出现一个链接 复制这个链接 打开要上传的项目 删除.idea/target/iml文件 cmd打开小黑窗 输入这个命令 初始化 添加仓库缓存 git init git xxx 把刚刚复制的链接放上去 gi…

【深度学习】大模型GLM-4-9B Chat ,微调与部署(3) TensorRT-LLM、TensorRT量化加速、Triton部署

文章目录 获取TensorRT-LLM代码&#xff1a;构建docker镜像并安装TensorRT-LLM&#xff1a;运行docker镜像&#xff1a;安装依赖魔改下部分package代码&#xff1a;量化&#xff1a;构建图&#xff1a;全局参数插件配置常用配置参数 测试推理是否可以代码推理CLI推理 性能测试小…

pyqt designer使用spliter

1、在designer界面需要使用spliter需要父界面不使用布局&#xff0c;减需要分割两个模块选中&#xff0c;再点击spliter分割 2、在分割后&#xff0c;再对父界面进行布局设置 3、对于两边需要不等比列放置的&#xff0c;需要套一层 group box在最外层进行分割

从善如流之您最亲近人之善,肯出力之象-下学而上达

您最亲近人之善&#xff0c;肯出力之象&#xff0c;就是那个爬&#xff0c;甚至于跪倒在地上&#xff0c;抹那个下水井子。这或许就是那个马云大佬讲过的&#xff0c;就是从您最近距离&#xff0c;身边的人学习。人家为啥做的好&#xff0c;出色&#xff1f;而且您是一母同胞之…

基于微信小程序+SpringBoot+Vue的网络安全科普系统(带1w+文档)

基于微信小程序SpringBootVue的网络安全科普系统(带1w文档) 基于微信小程序SpringBootVue的网络安全科普系统(带1w文档) 优质的网络安全科普系统不仅可以单纯的满足工作人员管理的日常工作需求&#xff0c;还可以满足用户的需求。可以降低工作人员的工作压力&#xff0c;提高效…

LeetCode刷题笔记第682题:棒球比赛

LeetCode刷题笔记第682题&#xff1a;棒球比赛 题目&#xff1a; 想法&#xff1a; 遍历输入的列表&#xff0c;按照规则将分数和操作依次进行&#xff0c;存储在新建的列表中&#xff0c;最终输出列表中的元素和&#xff0c;代码如下&#xff1a; class Solution:def calPo…

网安零基础入门神书,全面介绍Web渗透核心攻击与防御方式!

Web安全是指Web服务程序的漏洞&#xff0c;通常涵盖Web漏洞、操作系统洞、数据库漏洞、中间件漏洞等。 “渗透测试”作为主动防御的一种关键手段&#xff0c;对评估网络系统安全防护及措施至关重要&#xff0c;因为只有发现问题才能及时终止并预防潜在的安全风险。 根据网络安…

第6篇文献研读生态廊道相关综述

该文发在生态与农村环境学报。该文章写了生态廊道概念的发展历程、生态廊道类型及功能、生态廊道划定的理论和方法、生态廊道的时间和国内大型生态廊道建设实践。 这篇文章可以让大家了解生态廊道的知识。

C语言实现K均值聚类

K均值聚类(K_means)基础理论 K_means聚类是一种简单且广泛使用的聚类算法&#xff0c;它旨在将数据集中的样本划分为k个不同的聚类&#xff0c;其中k是事先指定的聚类数量&#xff0c;该算法的核心思想是迭代地优化聚类中心&#xff0c;以最小化每个样本与其所属聚类中心之间的…

懂个锤子Vue 项目工程化进阶⏫:

Vue项目工程化进阶⏫&#xff1a; 前言&#xff1a; 紧跟前文&#xff0c;目标学习Vue2.0——3.0&#xff1a; 懂个锤子Vue、WebPack5.0、WebPack高级进阶 涉及的技术栈… 当然既然学习框架的了&#xff0c;HTMLCSSJS三件套必须的就不说了&#xff1a; JavaScript 快速入门 …

react中如何mock数据

1.需求说明 因为前后端分离开发项目&#xff0c;就会存在前端静态页面写好了&#xff0c;后端数据接口还没写好&#xff1b;这时候前端就需要自己定义数据来使用。 定义数据有三种方式&#xff1a;直接写死数据、使用mock软件、json-server工具 这里讲解通过json-server工具…

面向对象程序设计(C++)模版初阶

1. 函数模版 1.1 函数模版概念 函数模板代表了一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用时被参数化&#xff0c;根据实参类型产生函数的特定类型版本&#xff0c;可以类比函数参数&#xff0c;函数模版就是将函数参数替换为特定类型版本 1.2 函数模版格…

基于ant-design-vue3多功能操作表格,表头序号为动态添加记录按钮,鼠标在表格记录行,当前行序号显示删除按钮

由于项目需要&#xff0c;并考虑到尽可能让空间利用率高&#xff0c;因此定制开发一个表格组件&#xff0c;组件功能主要是在序号表头位置为添加按钮&#xff0c;点击按钮&#xff0c;新增一行表格数据&#xff1b;表格数据删除不同于以往表格在操作栏定义删除按钮&#xff0c;…

问题解决|如何优雅展示层级或关联数据?

一、8种可用图表类型及配套教程 &#xff08;一&#xff09;包珠图 &#xff08;1&#xff09;功能介绍 包珠图&#xff08;Circular Packing&#xff09;&#xff0c;是一类较特殊的分类树状图&#xff0c;以气泡之间的包含关系展示层级关系&#xff0c;以气泡面积&#xf…

Spring事件机制

文章目录 一、Spring事件二、实现Spring事件1、自定义事件2、事件监听器2.1 实现ApplicationListener接口2.2 EventListener2.3 TransactionalEventListener 3、事件发布4、异步使用 三、EventBus1、事件模式2、EventBus三要素3、同步事件3.1 定义事件类3.2 定义事件监听3.3 测…

解析西门子PLC的String和WString

西门子PLC有两种字符串类型&#xff0c;String与WString String 用于存放英文数字标点符号等ASCII字符&#xff0c;每个字符占用一个字节 WString宽字符串用于存放中文、英文、数字等Unicode字符&#xff0c;每个字符占用两个字节 之前我搞过一篇解析String的 关于使用TCP-…

Kotlin 的优势:现代编程语言的卓越选择

文章目录 简洁与优雅的语法空安全特性函数式编程&#xff0c;支持高阶函数、lambdaKotlin 内联函数与 Java 的互操作性强大的类型推断协程支持lazy 委托object 单例模式区间表达式现代的开发工具支持 本文首发地址 https://h89.cn/archives/301.html 最新更新地址 https://gite…

包装类和泛型

&#x1f389;欢迎大家收看&#xff0c;请多多支持&#x1f339; &#x1f970;关注小哇&#xff0c;和我一起成长&#x1f680;个人主页&#x1f680; 包装类&#x1f319; Java中每个基本数据类型都对应了一个包装类&#xff0c; 除了int的包装类是Integer&#xff0c;char…

微信小程序开发 快速学习 这篇就够了

目录 一、配置篇 &#xff08;1&#xff09;官网链接&#xff1a; &#xff08;2&#xff09;项目分析 &#xff08;3&#xff09;调试器 &#xff08;4&#xff09;预览体验 &#xff08;5&#xff09;配置文件 &#xff08;6&#xff09;配置pages &#xff08;7&…