当前位置:   article > 正文

基于Element-UI的组件改造的树形选择器(树形下拉框)_elementui树形下拉框

elementui树形下拉框

前言:由于做项目需要一个树形选择器,项目用的也是element-ui框架,然而它自带的选择器组件没有树形选项,又不想引入其他的框架组件,于是自己利用el-select和el-tree改造了一个,感觉还挺好用的,就封装成了一个组件,如下图:

element-ui的el-select组件的选项只能是列表形式:

 改造后的树形选择器:

简介:此树形选择器组件是基于elment-ui框架的el-select和el-tree组件的基础上改造的,其解决了原el-select组件的选项列表不能是树形的问题,集合了前两个组件的属性和方法封装成了一个组件,引入即可使用。其实现了树形列表、默认展开、默认选中、清空选值等功能,基本上可以满足大部分选择器的使用需求。

主要代码

组合el-select和el-tree组件:

  1. <template>
  2. <el-select :value="valueTitle" :clearable="clearable" @clear="clearHandle">
  3. <el-option :value="valueTitle" :label="valueTitle">
  4. <el-tree id="tree-option"
  5. ref="selectTree"
  6. :accordion="accordion"
  7. :data="options"
  8. :props="props"
  9. :node-key="props.value"
  10. :default-expanded-keys="defaultExpandedKey"
  11. @node-click="handleNodeClick">
  12. </el-tree>
  13. </el-option>
  14. </el-select>
  15. </template>

封装组件:

  1. <script>
  2. export default {
  3. name: "el-tree-select",
  4. props:{
  5. /* 配置项 */
  6. props:{
  7. type: Object,
  8. default:()=>{
  9. return {
  10. value:'id', // ID字段名
  11. label: 'title', // 显示名称
  12. children: 'children' // 子级字段名
  13. }
  14. }
  15. },
  16. /* 选项列表数据(树形结构的对象数组) */
  17. options:{
  18. type: Array,
  19. default: ()=>{ return [] }
  20. },
  21. /* 初始值 */
  22. value:{
  23. type: Number,
  24. default: ()=>{ return null }
  25. },
  26. /* 可清空选项 */
  27. clearable:{
  28. type:Boolean,
  29. default:()=>{ return true }
  30. },
  31. /* 自动收起 */
  32. accordion:{
  33. type:Boolean,
  34. default:()=>{ return false }
  35. },
  36. },
  37. data() {
  38. return {
  39. valueId:this.value, // 初始值
  40. valueTitle:'',
  41. defaultExpandedKey:[]
  42. }
  43. },
  44. mounted(){
  45. this.initHandle()
  46. },
  47. methods: {
  48. // 初始化值
  49. initHandle(){
  50. if(this.valueId){
  51. this.valueTitle = this.$refs.selectTree.getNode(this.valueId).data[this.props.label] // 初始化显示
  52. this.$refs.selectTree.setCurrentKey(this.valueId) // 设置默认选中
  53. this.defaultExpandedKey = [this.valueId] // 设置默认展开
  54. }
  55. this.$nextTick(()=>{
  56. let scrollWrap = document.querySelectorAll('.el-scrollbar .el-select-dropdown__wrap')[0]
  57. let scrollBar = document.querySelectorAll('.el-scrollbar .el-scrollbar__bar')
  58. scrollWrap.style.cssText = 'margin: 0px; max-height: none; overflow: hidden;'
  59. scrollBar.forEach(ele => ele.style.width = 0)
  60. })
  61. },
  62. // 切换选项
  63. handleNodeClick(node){
  64. this.valueTitle = node[this.props.label]
  65. this.valueId = node[this.props.value]
  66. this.$emit('getValue',this.valueId)
  67. this.defaultExpandedKey = []
  68. },
  69. // 清除选中
  70. clearHandle(){
  71. this.valueTitle = ''
  72. this.valueId = null
  73. this.defaultExpandedKey = []
  74. this.clearSelected()
  75. this.$emit('getValue',null)
  76. },
  77. /* 清空选中样式 */
  78. clearSelected(){
  79. let allNode = document.querySelectorAll('#tree-option .el-tree-node')
  80. allNode.forEach((element)=>element.classList.remove('is-current'))
  81. }
  82. },
  83. watch: {
  84. value(){
  85. this.valueId = this.value
  86. this.initHandle()
  87. }
  88. },
  89. };
  90. </script>

css样式:

  1. <style scoped>
  2. .el-scrollbar .el-scrollbar__view .el-select-dropdown__item{
  3. height: auto;
  4. max-height: 274px;
  5. padding: 0;
  6. overflow: hidden;
  7. overflow-y: auto;
  8. }
  9. .el-select-dropdown__item.selected{
  10. font-weight: normal;
  11. }
  12. ul li >>>.el-tree .el-tree-node__content{
  13. height:auto;
  14. padding: 0 20px;
  15. }
  16. .el-tree-node__label{
  17. font-weight: normal;
  18. }
  19. .el-tree >>>.is-current .el-tree-node__label{
  20. color: #409EFF;
  21. font-weight: 700;
  22. }
  23. .el-tree >>>.is-current .el-tree-node__children .el-tree-node__label{
  24. color:#606266;
  25. font-weight: normal;
  26. }
  27. </style>

查看demo

注意:此树形选择器要求的值(options)必须是树形对象数组,如你的值是扁平数据,需转换成树形数据。可参考js实现无限层级树形数据结构(创新算法)

------------------------------------------ 我是有底线的 -------------------------------------------

2019.05.01更新 --- 解决初始化时滚动条滚到底部的bug

2019.05.04更新 --- 解决默认值再次改变时页面没渲染的问题

2022.05.18更新 --- 该组件已停止迭代,element-plus官方已推出了TreeSelect 树形选择

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/901101
推荐阅读
相关标签
  

闽ICP备14008679号