店滴开发者手册店滴开发者手册
首页
指南
插件
接口
智能设备
element后台
SDK
首页
指南
插件
接口
智能设备
element后台
SDK
  • 后台

    • 管理系统开发文档
    • ddButton 组件开发文档
    • DdDrawer 抽屉组件
    • DdOperMenu 操作区域按钮组组件
    • EleForm 基础表单组件
    • EleFormDynamic 动态表单组件
    • EleFormImageUploader 图片上传组件
    • EleFormMap 地图组件
    • EleFormTreeSelect 树形选择组件
    • VueUeditorWrap 百度编辑器组件
    • EleFormUploadFile 文件上传组件
    • EleFormVideoUploader 视频上传组件
    • 表单配置文档
    • DdLevelTable 层级表格组件
    • ListForm 弹窗表单组件
    • DdTable 组件使用文档

EleFormTreeSelect 树形选择组件

组件介绍

EleFormTreeSelect 是一个基于 Element UI 封装的树形选择组件,用于在表单中快速实现树形结构数据的选择功能。它支持单选、多选、搜索等功能,适用于分类选择、权限选择等场景。

安装与引入

安装依赖

npm install diandi-ele-form-tree-select

全局引入

在 src/projects/scrm/utils/el-form.js 中全局引入和配置:

import Vue from 'vue'
import EleFormTreeSelect from 'diandi-ele-form-tree-select'

// 注册 tree-select 组件
Vue.component('tree-select', EleFormTreeSelect)

// 全局配置
Vue.use(EleForm, {
  // 属性参考: https://vue-treeselect.js.org/ https://vue-treeselect.cn/
  'tree-select': {
    clearable: true // 所有的 tree-select 都会有 clearable = true的属性值
  }
})

全局配置

// 全局 tree-select 配置
'tree-select': {
  clearable: Boolean // 是否可清空
}

基本使用

单选模式

<template>
  <ele-form
    :form-data="formData"
    :form-config="formConfig"
    @submit="handleSubmit"
  />
</template>

<script>
export default {
  data() {
    return {
      formData: {
        category: ''
      },
      formConfig: [
        {
          label: '分类',
          prop: 'category',
          type: 'tree-select',
          props: {
            data: [
              {
                label: '分类1',
                value: '1',
                children: [
                  {
                    label: '子分类1-1',
                    value: '1-1'
                  }
                ]
              },
              {
                label: '分类2',
                value: '2'
              }
            ]
          }
        }
      ]
    }
  },
  methods: {
    handleSubmit(data) {
      console.log('表单数据:', data)
    }
  }
}
</script>

多选模式

<template>
  <ele-form
    :form-data="formData"
    :form-config="formConfig"
    @submit="handleSubmit"
  />
</template>

<script>
export default {
  data() {
    return {
      formData: {
        roles: []
      },
      formConfig: [
        {
          label: '角色',
          prop: 'roles',
          type: 'tree-select',
          props: {
            multiple: true,
            data: [
              {
                label: '管理员',
                value: 'admin',
                children: [
                  {
                    label: '系统管理员',
                    value: 'system'
                  },
                  {
                    label: '用户管理员',
                    value: 'user'
                  }
                ]
              },
              {
                label: '普通用户',
                value: 'user'
              }
            ]
          }
        }
      ]
    }
  },
  methods: {
    handleSubmit(data) {
      console.log('表单数据:', data)
    }
  }
}
</script>

属性配置

基础属性

属性类型描述默认值
dataArray树形数据[]
multipleBoolean是否多选false
placeholderString占位符'请选择'
disabledBoolean是否禁用false
clearableBoolean是否可清空true
filterableBoolean是否可搜索false
searchableBoolean是否可搜索false
collapseTagsBoolean是否折叠标签false
nodeKeyString节点键名'value'
propsObject树形配置{}
checkStrictlyBoolean是否严格勾选false
defaultExpandAllBoolean是否默认展开所有false
expandOnClickNodeBoolean是否点击节点展开true
checkOnClickNodeBoolean是否点击节点勾选false
renderContentFunction自定义节点渲染-
renderAfterExpandBoolean是否在展开后渲染子节点true
highlightCurrentBoolean是否高亮当前选中节点false
currentNodeKey[String, Number]当前选中节点的key-
defaultExpandedKeysArray默认展开的节点key数组[]
defaultCheckedKeysArray默认勾选的节点key数组[]
defaultSelectedKeysArray默认选中的节点key数组[]
indentNumber相邻级节点间的水平缩进,单位为像素16
iconClassString自定义展开/折叠图标类名-
renderIconFunction自定义节点图标-
renderLabelFunction自定义节点标签-
allowChildrenFunction决定节点是否可拥有子节点-
filterNodeMethodFunction节点过滤方法-
autoExpandParentBoolean是否在选中节点后自动展开其父节点true
accordionBoolean是否开启手风琴模式false
lazyBoolean是否懒加载false
loadFunction加载子节点的方法,仅当 lazy 属性为true时有效-
showCheckboxBoolean是否显示复选框false
checkStrictlyBoolean是否严格勾选false
defaultExpandAllBoolean是否默认展开所有节点false
expandOnClickNodeBoolean是否在点击节点时展开或折叠节点true
checkOnClickNodeBoolean是否在点击节点时选中节点false
currentNodeKey[String, Number]当前选中节点的key-
nodeKeyString每个树节点用来作为唯一标识的属性,整棵树应该是唯一的-
draggableBoolean是否可拖拽false
allowDragFunction决定节点是否可拖拽-
allowDropFunction决定节点是否可放置-
sortableBoolean是否可排序false
filterableBoolean是否可搜索false
remoteBoolean是否远程搜索false
remoteMethodFunction远程搜索方法-
loadingBoolean是否加载中false
loadingTextString加载中提示文本'加载中...'
noMatchTextString无匹配结果提示文本'无匹配数据'
noDataTextString无数据提示文本'无数据'
popperClassString下拉框类名-
popperAppendToBodyBoolean是否将下拉框附加到body上true
appendToBodyBoolean是否将下拉菜单附加到body上false
value[String, Number, Array]绑定值-
sizeString组件大小'medium'
nameString原生name属性-
labelString标签文本-
requiredBoolean是否必填false
rulesArray验证规则[]
errorString错误信息-
validateEventBoolean是否在输入时触发表单验证true

树形配置

props: {
  label: String, // 节点标签字段名
  value: String, // 节点值字段名
  children: String, // 子节点字段名
  disabled: String, // 禁用字段名
  isLeaf: String // 是否为叶子节点字段名
}

事件

事件名称回调参数描述
changevalue值变化时触发
node-clicknode, event节点点击时触发
check-changenode, checked, indeterminate节点勾选状态变化时触发
current-changecurrentNode, oldCurrentNode当前选中节点变化时触发
node-expandnode, expandedNodes节点展开时触发
node-collapsenode节点折叠时触发
node-drag-startnode, event节点开始拖拽时触发
node-drag-enternode, event, targetNode节点拖拽进入目标节点时触发
node-drag-leavenode, event, targetNode节点拖拽离开目标节点时触发
node-drag-overnode, event, targetNode节点拖拽经过目标节点时触发
node-drag-endnode, event, targetNode, droppedPosition节点拖拽结束时触发
node-dropnode, event, targetNode, droppedPosition节点被放置时触发
visible-changevisible下拉框显示/隐藏时触发
remove-tagvalue移除标签时触发
clear-清空时触发
blurevent失焦时触发
focusevent聚焦时触发

常见问题

1. 数据不显示

原因:树形数据格式错误或属性配置不当

解决方案:

  • 检查 data 格式是否正确,确保包含 label 和 value 字段
  • 确认 props 配置是否与数据格式匹配
  • 对于懒加载,检查 load 方法是否正确实现

2. 多选功能不生效

原因:multiple 配置错误或 showCheckbox 配置不当

解决方案:

  • 检查 multiple 属性是否设置为 true
  • 对于需要显示复选框的场景,设置 showCheckbox: true
  • 对于严格勾选模式,设置 checkStrictly: true

3. 搜索功能不生效

原因:filterable 或 searchable 配置错误

解决方案:

  • 检查 filterable 或 searchable 属性是否设置为 true
  • 对于远程搜索,设置 remote: true 并实现 remoteMethod 方法
  • 对于本地搜索,确保 data 数据已正确加载

示例代码

完整示例

<template>
  <ele-form
    :form-data="formData"
    :form-config="formConfig"
    :label-width="'120px'"
    @submit="handleSubmit"
  />
</template>

<script>
export default {
  data() {
    return {
      formData: {
        category: '',
        roles: []
      },
      formConfig: [
        {
          label: '分类',
          prop: 'category',
          type: 'tree-select',
          required: true,
          props: {
            data: [
              {
                label: '电子产品',
                value: 'electronics',
                children: [
                  {
                    label: '手机',
                    value: 'phone',
                    children: [
                      {
                        label: '苹果',
                        value: 'iphone'
                      },
                      {
                        label: '华为',
                        value: 'huawei'
                      }
                    ]
                  },
                  {
                    label: '电脑',
                    value: 'computer'
                  }
                ]
              },
              {
                label: '服装',
                value: 'clothing'
              }
            ],
            placeholder: '请选择分类',
            filterable: true
          }
        },
        {
          label: '角色',
          prop: 'roles',
          type: 'tree-select',
          props: {
            multiple: true,
            showCheckbox: true,
            data: [
              {
                label: '管理员',
                value: 'admin',
                children: [
                  {
                    label: '系统管理员',
                    value: 'system'
                  },
                  {
                    label: '用户管理员',
                    value: 'user'
                  },
                  {
                    label: '内容管理员',
                    value: 'content'
                  }
                ]
              },
              {
                label: '普通用户',
                value: 'user'
              },
              {
                label: '访客',
                value: 'guest'
              }
            ],
            placeholder: '请选择角色',
            collapseTags: true
          }
        }
      ]
    }
  },
  methods: {
    handleSubmit(data) {
      console.log('表单数据:', data)
      // 这里可以进行API调用等操作
      this.$message.success('提交成功')
    }
  }
}
</script>

<style scoped>
/* 自定义样式 */
</style>

远程搜索示例

<template>
  <ele-form
    :form-data="formData"
    :form-config="formConfig"
    @submit="handleSubmit"
  />
</template>

<script>
export default {
  data() {
    return {
      formData: {
        category: ''
      },
      formConfig: [
        {
          label: '分类',
          prop: 'category',
          type: 'tree-select',
          props: {
            data: [],
            placeholder: '请输入分类名称搜索',
            filterable: true,
            remote: true,
            loading: false,
            remoteMethod: this.remoteMethod
          }
        }
      ]
    }
  },
  methods: {
    handleSubmit(data) {
      console.log('表单数据:', data)
    },
    remoteMethod(query) {
      if (query) {
        this.formConfig[0].props.loading = true
        // 模拟远程搜索
        setTimeout(() => {
          this.formConfig[0].props.loading = false
          this.formConfig[0].props.data = [
            {
              label: `搜索结果: ${query}`,
              value: query,
              children: [
                {
                  label: `子结果1: ${query}`,
                  value: `${query}-1`
                },
                {
                  label: `子结果2: ${query}`,
                  value: `${query}-2`
                }
              ]
            }
          ]
        }, 1000)
      } else {
        this.formConfig[0].props.data = []
      }
    }
  }
}
</script>

总结

EleFormTreeSelect 是一个功能强大的树形选择组件,通过简单的配置即可快速实现在表单中的树形结构数据选择功能。它支持多种配置选项,可以满足不同场景下的树形选择需求。

通过全局配置和组件级配置的结合,可以灵活应对各种树形选择场景,大大提高了开发效率。

版本信息

  • 最后更新时间: 2025-03-08
  • 维护者: Wang chunsheng 2192138785@qq.com
Prev
EleFormMap 地图组件
Next
VueUeditorWrap 百度编辑器组件