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

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

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

  • 只能勾选叶子节点

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

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

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


🔧 基础结构

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

<el-treeref="treeRef"class="filter-tree":data="treeList":props="defaultProps"default-expand-allnode-key="id"highlight-currentv-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.idcheckedKeys.value = [firstChildId]treeRef.value.setCheckedKeys([firstChildId])treeName.value = firstChild.namegetMetadataList(firstChildId)}
})

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

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

const handleCheck = (data, checked) => {const tree = treeRef.valueconst isLeaf = !data.children || data.children.length === 0if (!isLeaf) {// 如果不是叶子节点,取消勾选tree.setCheckedKeys([])return}if (checked) {// 只保留当前选中的一个tree.setCheckedKeys([data.id])checkedKeys.value = [data.id]treeName.value = data.namegetMetadataList(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,可以留言获取!

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

http://www.lryc.cn/news/2392199.html

相关文章:

  • CAD精简多段线顶点、优化、删除多余、重复顶点——CAD c#二次开发
  • 输电线路的“智慧之眼”:全天候可视化监测如何赋能电网安全运维
  • Spring 核心知识点补充
  • 两阶段法目标检测发展脉络
  • Flannel 支持的后端
  • 小白的进阶之路系列之六----人工智能从初步到精通pytorch数据集与数据加载器
  • SQL进阶之旅 Day 5: 常用函数与表达式
  • NestJS——重构日志、数据库、配置
  • c++数据结构8——二叉树的性质
  • Window Server 2019--08 网络负载均衡与Web Farm
  • arcgis字段计算器中计算矢量面的每个点坐标
  • SpringBoot:统一功能处理、拦截器、适配器模式
  • AI Agent工具全景解析:从Coze到RAGflow,探索智能体自动化未来!
  • GitLab CI流水线权限隔离
  • xcode卡死问题,无论打开什么程序xcode总是在转菊花,重启电脑,卸载重装都不行
  • Onvif协议:IPC客户端开发-IPC相机控制(c语言版)
  • 如何最简单、通俗地理解Pytorch?神经网络中的“梯度”是怎么自动求出来的?PyTorch的动态计算图是如何实现即时执行的?
  • QT+opecv如何更改图片的拍摄路径
  • WebSocket学习总结
  • 秋招Day11 - JVM - 类加载机制
  • Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)
  • PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums
  • Vert.x学习笔记-什么是Handler
  • 浏览器游戏的次世代革命:WebAssembly 3.0 实战指南
  • Java设计模式之工厂模式与策略模式简单案例学习
  • 【Echarts】象形图
  • git 本地合并怎么撤回
  • 集星云推短视频矩阵系统的定制化与私有化部署方案
  • npm run build 报错:Some chunks are larger than 500 KB after minification
  • XCTF-web-file_include