Vue3 + Element Plus 实现树形结构的“单选 + 只选叶子节点 + 默认选中第一个子节点”

在 Vue 项目中,我们常使用树形结构组件来展示层级数据。本文将介绍如何使用 Element Plus 的 <el-tree> 组件,在 Vue3 中实现以下需求:

  • 只能勾选叶子节点

  • 每次只能选中一个节点(单选)

  • 页面加载时默认选中第一个父节点的第一个子节点

适用于菜单选择、元数据管理、权限勾选等实际业务场景。


🔧 基础结构

先在模板中使用 <el-tree> 组件,开启勾选功能:

复制代码
<el-tree
  ref="treeRef"
  class="filter-tree"
  :data="treeList"
  :props="defaultProps"
  default-expand-all
  node-key="id"
  highlight-current
  v-model="checkedKeys"
  :check-strictly="true"
  :filter-node-method="filterNode"
  show-checkbox
  @check-change="handleCheck"
/>

说明:

  • show-checkbox: 开启复选框

  • check-strictly: 允许父子节点互不关联勾选

  • @check-change: 自定义处理勾选行为


📦 树结构数据与属性设置

复制代码
const treeList = ref([
  {
    id: 1,
    name: '父节点 1',
    children: [
      { id: 11, name: '子节点 1-1' },
      { id: 12, name: '子节点 1-2' }
    ]
  },
  {
    id: 2,
    name: '父节点 2',
    children: [
      { id: 21, name: '子节点 2-1' }
    ]
  }
])

const defaultProps = {
  children: 'children',
  label: 'name'
}

🚀 默认选中第一个子节点

我们希望在页面加载时,就自动选中第一个父节点的第一个子节点:

复制代码
onMounted(() => {
  const firstParent = treeList.value[0]
  if (firstParent?.children?.length) {
    const firstChild = firstParent.children[0]
    const firstChildId = firstChild.id
    checkedKeys.value = [firstChildId]
    treeRef.value.setCheckedKeys([firstChildId])
    treeName.value = firstChild.name
    getMetadataList(firstChildId)
  }
})

✅ 实现"只能选叶子节点 + 单选"

通过监听 check-change 事件,控制只能勾选叶子节点,并保证是单选:

复制代码
const handleCheck = (data, checked) => {
  const tree = treeRef.value
  const isLeaf = !data.children || data.children.length === 0

  if (!isLeaf) {
    // 如果不是叶子节点,取消勾选
    tree.setCheckedKeys([])
    return
  }

  if (checked) {
    // 只保留当前选中的一个
    tree.setCheckedKeys([data.id])
    checkedKeys.value = [data.id]
    treeName.value = data.name
    getMetadataList(data.id)
  }
}

说明:

  • isLeaf 判断节点是否为叶子节点

  • 非叶子节点禁止勾选

  • 每次只勾选一个节点,模拟"单选"行为


📡 示例接口调用

复制代码
function getMetadataList(id) {
  console.log('请求元数据 for 节点 ID:', id)
  // 示例:调用接口
  // axios.get(`/api/metadata/${id}`).then(res => ...)
}

🧩 效果演示

加载后默认选中:

复制代码
父节点 1
  ✅ 子节点 1-1 ← 默认选中
  ⬜ 子节点 1-2
父节点 2
  ⬜ 子节点 2-1

勾选任何父节点会自动清除;只能勾选一个叶子节点。


🔚 总结

通过本文,我们实现了:

  • 🌳 使用 Element Plus 构建树形选择组件

  • 🔐 限制为"只能选中叶子节点"

  • 🔘 实现"单选"逻辑

  • 🚀 支持页面加载默认选中第一个子节点

这种方式在实际业务系统中非常常见,建议封装成通用组件,便于后续复用。


📌 如需完整代码或打包 Demo,可以留言获取!

如果你觉得本文对你有帮助,欢迎点赞 + 收藏 + 关注支持 ❤️

相关推荐
hpoenixf4 小时前
2026 年前端面试问什么
前端·面试
还是大剑师兰特4 小时前
Vue3 中的 defineExpose 完全指南
前端·javascript·vue.js
泯泷4 小时前
阶段一:从 0 看懂 JSVMP 架构,先在脑子里搭出一台最小 JSVM
前端·javascript·架构
mengchanmian5 小时前
前端node常用配置
前端
华洛5 小时前
利好打工人,openclaw不是企业提效工具,而是个人助理
前端·javascript·产品经理
xkxnq5 小时前
第六阶段:Vue生态高级整合与优化(第93天)Element Plus进阶:自定义主题(变量覆盖)+ 全局配置与组件按需加载优化
前端·javascript·vue.js
A黄俊辉A6 小时前
vue css中 :global的使用
前端·javascript·vue.js
小码哥_常7 小时前
被EdgeToEdge适配折磨疯了,谁懂!
前端
小码哥_常7 小时前
从Groovy到KTS:Android Gradle脚本的华丽转身
前端
灵感__idea7 小时前
Hello 算法:复杂问题的应对策略
前端·javascript·算法