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

树形结构渲染 + 选择(Vue3 + ElementPlus)

后端数据├─ 平铺数组  →  listToTree  →  deptTree└─ 树形数组  →  直接使用<el-tree-select>├─ v-model        = 选中id├─ :data          = deptTree├─ :props         = 字段映射└─ @change        = 递归拿节点 → 回显名称

1. 完整 mini Demo(可运行)

<template><el-form :model="form" label-width="80"><el-form-item label="部门" prop="deptId" :rules="[{ required: true }]"><el-tree-selectv-model="form.deptId":data="deptTree"placeholder="请选择部门"check-strictly:props="{ label: 'name', value: 'id' }"clearable@change="onChange" /></el-form-item></el-form>
</template><script setup lang="ts">
import { ref } from 'vue';// 模拟平铺数据
const flat = [{ id: 1, name: '总部',  parentId: 0 },{ id: 11, name: '技术部', parentId: 1 },{ id: 12, name: '财务部', parentId: 1 }
];// 工具:转树
const listToTree = (list: any[], root = 0, key = 'id', parentKey = 'parentId') => {const map: any = {};list.forEach(item => map[item[key]] = item);const tree: any[] = [];list.forEach(item => {const parent = map[item[parentKey]];if (parent) (parent.children ||= []).push(item);else if (item[parentKey] === root) tree.push(item);});return tree;
};const deptTree = ref(listToTree(flat));
const form = ref({ deptId: null as number | null, deptName: '' });const findNodeDeep = (tree: any[] | undefined, id: number): any | undefined => {if (!tree) return;for (const node of tree) {if (node.id === id) return node;const found = findNodeDeep(node.children, id);if (found) return found;}
};const onChange = (id: number) => {const node = findNodeDeep(deptTree.value, id);form.value.deptName = node?.name ?? '';
};
</script>

1. 第 1 步:先看清后端数据长啥样

① 平铺数组(最常见)

[{ id: 1, name: '总部',  parentId: 0 },{ id: 11, name: '技术部', parentId: 1 },{ id: 12, name: '财务部', parentId: 1 }
]

→ 需要 转树

② 已经是树

[{ id: 1, name: '总部', children: [{ id: 11, name: '技术部', children: [] },{ id: 12, name: '财务部', children: [] }]}
]

→ 直接可用。

2. 第 2 步:平铺转树工具函数

function listToTree(list: any[], root = 0, key = 'id', parentKey = 'parentId', childKey = 'children') {const map: any = {};list.forEach(item => map[item[key]] = item);const tree: any[] = [];list.forEach(item => {const parent = map[item[parentKey]];if (parent) {(parent[childKey] ||= []).push(item);} else if (item[parentKey] === root) {tree.push(item);}});return tree;
}    

用法:

const deptTree = listToTree(flatList);  // 得到 ElementPlus 直接能用的数组

3. 第 3 步:选对组件 & 记住 4 个核心属性

组件属性含义
<el-tree-select>v-model绑定 选中值(一般是 id
:data树形数组
:props字段映射 { label: 'name', value: 'id', children: 'children' }
@change选中变化回调,参数就是 value
<el-tree-selectv-model="form.deptId":data="deptTree"placeholder="请选择部门"check-strictly:props="{ label: 'name', value: 'id' }"clearable@change="onChange" />

4. 第 4 步:选中后拿“名称”或其他字段

组件只返回 id,要名称 → 递归找节点

function findNodeDeep(tree: any[] | undefined, id: number): any | undefined {if (!tree) return;for (const node of tree) {if (node.id === id) return node;const found = findNodeDeep(node.children, id);if (found) return found;}
}const onChange = (id: number) => {const node = findNodeDeep(deptTree, id);form.deptName = node?.name ?? '';  // 回显名称form.deptId   = id;                // 保存 id
};

5. 第 5 步:默认值 / 回显(编辑场景)

// 新增:空值
form.deptId = null;// 编辑:把后端返回的 id 丢进去即可
form.deptId = row.deptId;   // 组件会自动高亮对应节点

6. 第 6 步:校验 & 清空

场景说明
必填<el-form-item label="部门" prop="deptId" :rules="[{ required: true, message: '请选择' }]">
清空组件自带 clearable,清空后 form.deptId = null,无需额外处理
http://www.dtcms.com/a/485941.html

相关文章:

  • Redis技术应用
  • hot100练习-8
  • 手机网站设置在哪里找房产信息平台
  • 算法入门:专题二---滑动窗口(长度最小的子数组)更新中
  • 2025年存储市场报告深度解读
  • HTTP 413 状态码详解与前端处理,请求体过大
  • 大数据背景下时序数据库选型指南:国产开源技术的突破与实践
  • asp网站优化云南网站制作需求
  • k8s(六)Pod的资源控制器
  • TypeScript前端架构与开发技巧深度解析:从工程化到性能优化的完整实践
  • 郴州做网站网站建设公司ejiew
  • LeetCode 将数组和减半的最少操作次数
  • OpenHarmony南向开发环境搭建 - 深入理解Ubuntu、DevEco Device Tool与HPM
  • QT-day1
  • Spec-Kit+Copilot打造AI规格驱动开发
  • Linux服务器编程实践30-TCP交互数据流:Nagle算法与延迟确认的作用
  • MATLAB一个基于Attention-LSTM的分类模型,构建Attention-LSTM深度学习模型,训练模型并进行分类预测
  • 杭州网站建设朗诵面朝网站建设策划内容
  • 手机网站开发模板南昌网站设计建设
  • Playwright中page的实现类深度解析-PageImpl 方法作用解析
  • 【完整源码+数据集+部署教程】 【运动的&足球】足球场上球检测系统源码&数据集全套:改进yolo11-DGCST
  • 无用知识研究:如何用decltype里的逗号表达式判断一个类里面有operator <号,并在编译时优雅给出提示,而不是一大堆不相干的模板信息
  • 人类知识体系分类
  • Java 大视界 -- Java 大数据在智能政务数字身份认证与数据安全共享中的应用
  • 《Foundation 图标参考手册》
  • 从 “坑“ 到 “通“:Spring AOP 通知执行顺序深度解密
  • 博途SCL语言仿真七段数码管
  • 关于网站建设的介绍本地搭建wordpress建站教程
  • 免费网站收录网站推广苏州网站建设推荐q479185700霸屏
  • 【LeetCode热题100(43/100)】验证二叉搜索树