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

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,可以留言获取!

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

相关文章:

  • [低代码表单生成器设计基础]ElementUI中Layout布局属性Form表单属性详解
  • el-table-column如何获取行数据的值
  • 【QT】理解QT的“元对象系统”
  • 企业文件乱、传输慢?用群晖 NAS 构建安全高效的共享系统
  • 【机器学习基础】机器学习入门核心算法:集成学习(Ensemble Learning)
  • Hive自定义函数案例(UDF、UDAF、UDTF)
  • 系统提示词:Google Stitch
  • 【Python零基础入门系列】第6篇:Python 的数据结构世界(列表、字典、集合、元组)
  • 基于ubuntu安装hadoop
  • C++17常量
  • 据传苹果将在WWDC上发布iOS 26 而不是iOS 19
  • 【C++高级主题】命令空间(三):未命名的命名空间
  • TI dsp FSI (快速串行接口)
  • WPF【11_10】WPF实战-重构与美化(配置Material UI框架)
  • Unity3D仿星露谷物语开发55之保存游戏到文件
  • 【数据结构】图论核心算法解析:深度优先搜索(DFS)的纵深遍历与生成树实战指南​
  • 深入理解C#中的LINQ:数据查询的终极利器
  • 人工智能100问☞第36问:什么是BERT?
  • 销讯通CRM——大健康行业CRM解决方案
  • Typescript学习教程,从入门到精通,TypeScript 泛型与类型操作详解(二)(17)
  • 京东商城网站域名/seo站长网怎么下载
  • 做汽配批发做那个网站比较好/seo运营工作内容
  • 怎么在浏览器上面建网站/新站整站优化
  • 网站上做网上支付功能/宁波seo关键词排名优化
  • .net网站 还原数据库备份/推广运营是做什么的
  • 自己可以学做网站吗/小红书关键词排名优化