当前位置: 首页 > news >正文

基于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>

总结

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 这一文,关于 Java 泛型的点点滴滴 一(泛型基础、类型擦除)
  • Javascript面试基础6【每日更新10】
  • MyBatis中的赋值语句:#{}和${}的区别差异(常见面试题)
  • 【Python机器学习】决策树的构造——划分数据集
  • 2024最新Uniapp的H5网页版添加谷歌授权验证
  • linux进程——解析命令行参数——环境变量详解
  • Spring Security面试三道题
  • 查找算法-二分查找(折半查找)
  • 《Unity3D高级编程 主程手记》第四章 用户界面(二) UGUI 系统的原理及其组件使用
  • 简化mybatis @Select IN条件的编写
  • Android monkey命令和monkey脚本详解
  • vim gcc
  • 【MQTT协议与IoT通信】MQTT协议的使用和管理
  • 追问试面试系列:开篇
  • HarmonyOS Next原生应用开发-从TS到ArkTS的适配规则(九)
  • [PHP内核探索]PHP中的哈希表
  • 时间复杂度分析经典问题——最大子序列和
  • axios 和 cookie 的那些事
  • JS+CSS实现数字滚动
  • Kibana配置logstash,报表一体化
  • Mac转Windows的拯救指南
  • markdown编辑器简评
  • mockjs让前端开发独立于后端
  • nfs客户端进程变D,延伸linux的lock
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Redis在Web项目中的应用与实践
  • springboot_database项目介绍
  • Windows Containers 大冒险: 容器网络
  • 工作中总结前端开发流程--vue项目
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 力扣(LeetCode)56
  • 面试遇到的一些题
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 如何设计一个比特币钱包服务
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 一、python与pycharm的安装
  • 一些css基础学习笔记
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)c++ std::pair 与 std::make
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .gitignore文件_Git:.gitignore
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes