Skip to content
vue3+elementplus选择下拉树形控件自带上级节点示例代码

PS:跟版本有关系,,实测:2.13.1版本的element-plus可以,,,但是低版本不行,,测试了如2.2.32版本的element-plus就不行,,低版本回显不了上级路径

js
<!-- AreaSelect.vue -->
<template>
  <el-form :model="queryForm" label-width="100px">
    <el-form-item label="管理片区">
      <!-- 1. v-model 仍绑叶子 value -->
      <el-tree-select
        v-model="queryForm.area"
        :data="areaTree"
        check-strictly
        clearable
        placeholder="请选择片区"
        style="width: 260px"
        @node-click="onNodeClick"
      >
        <!-- 关键:把输入框文字强行换成 areaLabel -->
        <template #label="{ node }">
          {{ areaLabel || node.data.label }}
        </template>
      </el-tree-select>
    </el-form-item>
  </el-form>

  <el-button type="primary" @click="handleSearch">查询</el-button>
  <el-button @click="reset">重置</el-button>

  <pre v-if="queryForm.area">提交参数:{{ queryForm }}</pre>
</template>

<script setup>
import { reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'

/* ---------- 表单 ---------- */
const queryForm = reactive({
  area: ''          // 仅保存叶子 value
})
const areaLabel = ref('')   // 中文路径,用来回显

/* ---------- 四级树 ---------- */
const areaTree = [
  {
    value: '华北',
    label: '华北',
    children: [
      {
        value: '北京',
        label: '北京',
        children: [
          {
            value: '朝阳',
            label: '朝阳',
            children: [
              { value: 'CBD', label: 'CBD' },
              { value: '三里屯', label: '三里屯' }
            ]
          },
          {
            value: '海淀',
            label: '海淀',
            children: [
              { value: '中关村', label: '中关村' },
              { value: '五道口', label: '五道口' }
            ]
          }
        ]
      }
    ]
  },
  {
    value: '西北',
    label: '西北',
    children: [
      {
        value: '陕西',
        label: '陕西',
        children: [
          {
            value: '西安',
            label: '西安',
            children: [
              { value: '雁塔', label: '雁塔' },
              { value: '碑林', label: '碑林' }
            ]
          }
        ]
      }
    ]
  }
]

/* ---------- 树节点点击 ---------- */
const onNodeClick = (data, node) => {
  const chain = []
  let p = node
  while (p && p.level > 0) {
    chain.unshift(p.data.label)
    p = p.parent
  }
  const fullPath = chain.join('>>')

  queryForm.area = data.value   // 叶子 value
  areaLabel.value = fullPath    // 中文路径
}

/* ---------- 业务按钮 ---------- */
const handleSearch = () => {
  ElMessage.success(`即将提交叶子 value:${queryForm.area}`)
}

const reset = () => {
  queryForm.area = ''
  areaLabel.value = ''
}
</script>