基于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 = undefinedthis.$emit('myInputEvent', {node: undefined, data: {label: undefined, value: undefined}, meta: undefined})this.$emit('onNodeSelectEvent', {node: undefined, data: {label: undefined, value: undefined}, meta: undefined})},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])this.$emit('myInputEvent', {node: data[this.defaultProps.value],data: {label: data[this.defaultProps.label], value: data[this.defaultProps.value]},meta: data})}} 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]this.$emit('myInputEvent', {node: data[this.defaultProps.value],data: {label: data[this.defaultProps.label], value: data[this.defaultProps.value]},meta: data})this.$emit('onNodeSelectEvent', {node: data[this.defaultProps.value],data: {label: data[this.defaultProps.label], value: data[this.defaultProps.value]},meta: data})this.closeSelect()}}
}
</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.mzph.cn/bicheng/49494.shtml

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

相关文章

Linux云计算 |【第一阶段】SERVICES-DAY2

主要内容&#xff1a; DNS服务基础及搭建、特殊解析(针对地址库文件&#xff1a;DNS轮询 DNS泛域名解析 DNS别名&#xff09;、缓存DNS&#xff08;全局转发forwarders&#xff09;、DNS递归迭代&#xff08;子域授权&#xff09;、DNS主从架构搭建、DNS主从数据同步 一、DNS工…

【技术升级】Docker环境下Nacos平滑升级攻略,安全配置一步到位

目前项目当中使用的Nacos版本为2.0.2&#xff0c;该版本可能存在一定的安全风险。软件的安全性是一个持续关注的问题&#xff0c;尤其是对于像Nacos这样的服务发现与配置管理平台&#xff0c;它在微服务架构中扮演着核心角色。随着新版本的发布&#xff0c;开发团队会修复已知的…

光伏模拟器应用

太阳能光伏 (PV) 模拟器是一种可编程电源&#xff0c;用于模拟太阳能电池板。模拟器具有快速瞬态响应&#xff0c;可响应负载条件的变化并保持电压-电流特性的输出。 用户可以根据系统规格定义太阳能电池板配置&#xff0c;并通过选择环境条件来选择适当的环境条件进行模拟。用…

pytest+allure

安装 下载&#xff1a;github win环境下载zip 环境变量&#xff1a; pycharm&#xff1a; pip install allure-pytest 验证安装 生成结果&#xff1a; if __name__ __main__:pytest.main([-s,test_createTag2.py,--alluredir,result]) 生成报告&#xff1a; allure gener…

如何查看Kafka的偏移量offset

本文介绍三种方法查看Kafka的偏移量offset。 1. API&#xff1a;ConsumerRecord的offset()方法查看offset。 2. API&#xff1a;KafkaConsumer的position(TopicPartition partition)方法查看offset。 3. 命令行&#xff1a;kafka-consumer-groups.sh命令查看offset。 前提条…

前置-Linux相关知识速记

linux Linux命令大全 [!IMPORTANT] chown-chmod-ls-chgrp-cdpwd-mkdir-rmdir-cp-rm-mv-cat-tac-nl-more-less-head-tail 应用领域 通常服务器使用 LAMP&#xff08;Linux Apache MySQL PHP&#xff09;或 LNMP&#xff08;Linux Nginx MySQL PHP&#xff09;组合。 目前…

STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51

STM32 BootLoader 刷新项目 (五) 获取软件版本号-命令0x51 下面我们来讲解第一个指令&#xff0c;获取软件版本号命令-0x51. 在BootLoader中获取软件版本号的操作有多个重要的作用&#xff0c;具体如下&#xff1a; 版本管理&#xff1a; 识别当前版本&#xff1a;通过获取软…

无人机上磁航技术详解

磁航技术&#xff0c;也被称为地磁导航&#xff0c;是一种利用地球磁场信息来实现导航的技术。在无人机领域&#xff0c;磁航技术主要用于辅助惯性导航系统&#xff08;INS&#xff09;进行航向角的测量与校正&#xff0c;提高无人机的飞行稳定性和准确性。其技术原理是&#x…

vue3 + antd vue 纯前端 基于xlsx 实现导入excel 转 json,将json数据转换XLSX导出(模版下载)

一、导入 0、关键代码 // 安装插件 npm i xlsx/yarn add xlsx // 导入xlsx import * as XLSX from xlsx; 点击提交的时候才整理数据。上传的时候文件保存在 state.form.file[0] 中的 // 定义字段映射关系 const fieldMap {sheet2json: {技能名称: skill_name,技能等级: …

微服务实战系列之玩转Docker(六)

前言 刚进入大暑&#xff0c;“清凉不肯来&#xff0c;烈日不肯暮”&#xff0c;空调开到晚&#xff0c;还是满身汗。——碎碎念 我们知道&#xff0c;仓库可见于不同领域&#xff0c;比如粮食仓库、数据仓库。在容器领域&#xff0c;自然也有镜像仓库&#xff08;registry&…

代码随想录——零钱兑换Ⅱ(Leetcode518)

题目链接 完全背包 class Solution {public int change(int amount, int[] coins) {int[] dp new int[amount 1];dp[0] 1;for(int i 0; i < coins.length; i){for(int j coins[i]; j < amount; j){dp[j] dp[j - coins[i]];}}return dp[amount];} }本题为组合问题…

uni-app AppStore Connect上传拒绝汇总

1.Guideline 2.3.3 - Performance - Accurate Metadata 问题是图片不对&#xff0c;最好是自己截图&#xff0c;然后用香蕉云编 上传图片合成图片 2.Guideline 5.1.2 - Legal - Privacy - Data Use and Sharing 解决办法&#xff1a;在uniapp manifest.json找到 APP常用其他…

【软考】系统集成项目管理工程师【第二版】

&#x1f44a;重要通知&#x1f44a; &#x1f44a; 1. 2024年中考上半年取消&#xff0c;改下半年&#x1f44a; &#x1f44a; 2. 2024下半年 使用《系统集成项目管理工程师教程》第三版&#x1f44a; &#x1f44a; 3. 为了方便大家学习&#xff0c;博主正在整理第三版 &am…

使用uniapp开发小程序(基础篇)

本文章只介绍微信小程序的开发流程&#xff0c;如果需要了解其他平台的开发的流程的话&#xff0c;后续根据情况更新相应的文章,也可以根据uniapp官网的链接了解不同平台的开发流程 HBuilderX使用&#xff1a;https://uniapp.dcloud.net.cn/quickstart-hx.html 开发工具 开始…

# OpenCV 图像预处理—形态学:膨胀、腐蚀、开运算、闭运算 原理详解

文章目录 形态学概念膨胀使用膨胀操作来修复裂痕示例代码关键解析&#xff1a; 腐蚀使用腐蚀操作消除噪点示例代码&#xff1a; 开运算—先腐蚀后膨胀闭运算—先膨胀后腐蚀 形态学概念 首先看这两张图片 一张图周围有大大小小的噪音和彩点&#xff0c;另一张图片中字母有间隙&…

php连接sql server

php连接sqlserver有三种方式 一&#xff1a;odbc连接&#xff0c;废话不多说直接上代码,封装了一个单例 <?php /*** odbcServer.php* Author: Erekys*/namespace App\Model; class odbcServer{public static $server;public static $username;public static $password;pu…

基于jeecgboot-vue3的Flowable流程仿钉钉流程设计器-发送信息服务处理

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、因为仿钉钉设计器里发送消息处理是一个服务任务&#xff0c;所以要根据这个服务任务进行处理 2、这里目前只对消息进行处理&#xff0c;就是用websocket的发送方式 输入相应的内容&…

go语言Gin框架的学习路线(十)

目录 GORM的CRUD教程 查询 普通查询 定义 User 结构体 查询所有用户 查询第一个用户 总结 条件查询 内联条件 额外查询选项 高级查询 链式操作 Scopes 多个立即执行方法 GORM的CRUD教程 CRUD 是 "Create, Read, Update, Delete"&#xff08;创建、查询…

AIoTedge边缘物联网平台,开启智能物联新架构

边缘物联网平台是一种将计算能力、数据处理和应用服务部署在网络边缘的解决方案&#xff0c;旨在提高响应速度、降低带宽需求和增强数据安全。根据搜索结果&#xff0c;边缘物联网平台应具备以下功能&#xff1a; 云边协同&#xff1a; 云边一体架构&#xff0c;通过云端管理边…

【BUG】已解决:Downgrade the protobuf package to 3.20.x or lower.

Downgrade the protobuf package to 3.20.x or lower. 目录 Downgrade the protobuf package to 3.20.x or lower. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身…