【原创】vue-element-admin-plus完成编辑页面中嵌套列表功能
前言
vue-element-admin-plus对于复杂业务的支持程度确实不怎么样,我这里就遇到了编辑页面中还要嵌套列表的真实案例,比如字典,主字典嵌套子信息,类似于一个树状结构。目前vue-element-admin-plus给出的例子是无法满足这个需求的。

修改Write
修改Edit和修改Write都是可以实现的,毕竟程序员只有不想做,哪有做不出来的道理。但是按照各司其职来说,修改components中的Write更好,毕竟同为内部编辑。
引入表格
由于只有新增完了主字典,才能新增其子内容,因此这里表格显示条件是只有编辑的情况才显示,新增的情况不显示。另外要加上标题和按钮,用于新增和删除子内容。
<template><Form :rules="rules" @register="formRegister" :schema="schema" /><div v-if="props.editType === 'edit'"><ElText type="primary" size="large" style="width: 100%">字典所属数据</ElText><div style="display: block; margin-top: 20px"><ElButton type="primary" @click="addChild">新增</ElButton><ElButton type="danger" @click="delChildList">删除</ElButton></div><ElTable :data="dictData" stripe style="width: 100%" @selection-change="selectionChange"><ElTableColumn type="selection" /><ElTableColumn label="字典值" prop="name" /><ElTableColumn label="字典码" prop="code" /><ElTableColumn label="字典说明" prop="remark" /><ElTableColumn label="操作"><template #default="slot"><ElButton type="primary" size="small" @click="editChild(slot.row)">编辑</ElButton><ElButton type="danger" size="small" @click="delChildRow(slot.row)">删除</ElButton></template></ElTableColumn></ElTable></div>
</template>
注意了,在这里template标签中引入的ElTable必须是大驼峰格式的,不能是小写且用-号连接的
props.editType是从Edit页面传进来的。
const props = defineProps({currentRow: {type: Object as PropType<Nullable<DictDetailVo>>,default: () => null},editType: {type: String,default: 'add'},editId: {type: Number,default: -1}
})
dictData需要自行定义,是一个ref引用的数组。
const dictData = ref<Array<DictDetailVo>>([])
addChild和delChildList是点击按钮时调用,这个放后面再说
列表中的editChild和delChildRow也是点击按钮时调用,放后面再说
准备子数据接口
由于我们需要对子列表进行操作,因此还需要这个列表的增删改查接口。
export const dictAddApi = (data: DictEditBo): Promise<IResponse<number>> => {return request.post({ url: '/dict/add.adw', data })
}export const dictUpdateApi = (data: DictEditBo): Promise<IResponse<any>> => {return request.post({ url: '/dict/update.adw', data })
}export const dictDeleteApi = (data: BaseDeleteBo): Promise<IResponse<any>> => {return request.post({ url: '/dict/delete.adw', data })
}export const dictChildrenApi = (data: DictSearchBo): Promise<IResponse<number>> => {return request.post({ url: '/dict/children.adw', data })
}
直接查询子数据接口:
const childrenSearch: DictSearchBo = {parentId: props.editId
}
const refreshChildren = () => {dictChildrenApi(childrenSearch).then((res) => {dictData.value = res.d as unknown as Array<DictDetailVo>})
}
refreshChildren()
进入页面时就需要调用refreshChildren接口了,入参需要将parentId传入,通过Edit页面传进来
新增、编辑对话框
在Write页面内部新增和编辑子列表就不要再跳转新的页面了,这里我使用ElDialog搞定,当然这里写的也必须是大驼峰形式的ElDialog,不能使用小写用-号拼接的,不然会识别不了。
<ElDialog v-model="showEditDictChildDialog" title="编辑字典项"><div><ElInput v-model="editDictDetail.name" placeholder="字典值" style="margin-bottom: 20px" /><ElInput v-model="editDictDetail.code" placeholder="字典码" style="margin-bottom: 20px" /><ElInput v-model="editDictDetail.remark" placeholder="字典说明" /></div><template #footer><ElButton @click="showEditDictChildDialog = false">取消</ElButton><ElButton type="primary" @click="handleSaveEdit">保存</ElButton></template></ElDialog>
其中showEditDictChildDialog是ref引用的布尔类型对象,用于显示和隐藏对话框。
const showEditDictChildDialog = ref(false)
editDictDetail就是新增和编辑用的对象,使用ref引用。
const editDictDetail = ref<DictEditBo>({id: 0,name: '',parentId: '',code: '',remark: ''
})
handleSaveEdit由保存按钮调用
const handleSaveEdit = () => {showEditDictChildDialog.value = falseif (!editDictDetail.value.id) {dictAddApi(editDictDetail.value).then(() => {refreshChildren()})} else {dictUpdateApi(editDictDetail.value).then(() => {refreshChildren()})}
}
关闭弹窗后,如果编辑的对象不存在id,则调用新增接口,否则调用编辑接口。
剩余方法
剩余的方法就是addChild、delChildList、editChild、delChildRow和selectionChange了。
addChild和editChild很像,其中add需要将弹窗内的数据重置,防止新增的数据还是之前的,其次就是弹出编辑弹窗了
const editChild = (row: DictDetailVo) => {showEditDictChildDialog.value = trueeditDictDetail.value = { ...row }
}const addChild = () => {// 重置新增对象editDictDetail.value = {id: undefined,name: '',parentId: props.editId,code: '',remark: ''}showEditDictChildDialog.value = true
}
两个删除方法也差不多,最多是弹出一个模态框用于提示删除警告,外加调用删除接口。
由于我写的后端删除接口只有传入id列表的,因此及时是删除单行,也被我作为列表传入了
const delChildRow = (row: DictDetailVo) => {ElMessageBox.confirm('是否要删除这条数据?', '删除警告', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {const nowDate = Date.now()const deleteBo: BaseDeleteBo = {ids: [row.id],rt: nowDate}dictDeleteApi(deleteBo).then(() => {refreshChildren()})})
}const delChildList = () => {ElMessageBox.confirm('是否要删除这些数据?', '删除警告', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {const nowDate = Date.now()const rowIds = selectList.value.map((row) => {return row.id})const deleteBo: BaseDeleteBo = {ids: rowIds,rt: nowDate}dictDeleteApi(deleteBo).then(() => {refreshChildren()})})
}
完成效果

修改Page
修改Table
给的默认例子的Page是无法做成树状图的,这里需要对Table标签进行修改,增加tree-props和row-key
<Tablev-model:pageSize="pageInfo.pageSize"v-model:currentPage="pageInfo.currentPage":columns="allSchemas.tableColumns":data="dataList":loading="loading":stripe="true":pagination="{total: pageInfo.totalCount}"@register="pageView.tableRegister":tree-props="treeProps"row-key="id"/>
tree-props用于指定树状图的子列表的字段名称
const treeProps = {children: 'children'
}
指定子列表的字段名为children,也就是说如果这个字段中存在一个列表,那就可以展开了。
row-key用于指定列表唯一值,防止展开混乱。
后端需要保证其传来的子列表字段也必须为children,否则树状列表不生效。
完成效果

完成效果如下,可以做到字典列表无限嵌套

编辑页面也能够嵌套列表了
结语
本篇文章给大家展示了在vue-element-plus-admin中如何在编辑页面嵌套子列表,给大家提供一个编辑思路。当然这里只是一个介绍思路的demo,并不是完整代码,如果真的要完整实现这个功能,还需要后端的协助,当然这里的前后端都我一个人开发就对了,哈哈😎
相关文章:
【原创】vue-element-admin-plus完成编辑页面中嵌套列表功能
前言 vue-element-admin-plus对于复杂业务的支持程度确实不怎么样,我这里就遇到了编辑页面中还要嵌套列表的真实案例,比如字典,主字典嵌套子信息,类似于一个树状结构。目前vue-element-admin-plus给出的例子是无法满足这个需求的…...
【深度学习】计算机视觉(CV)-目标检测-DETR(DEtection TRansformer)—— 基于 Transformer 的端到端目标检测
1.什么是 DETR? DETR(DEtection TRansformer) 是 Facebook AI(FAIR)于 2020 年提出的 端到端目标检测算法,它基于 Transformer 架构,消除了 Faster R-CNN、YOLO 等方法中的 候选框(…...
DeepSeek教unity------MessagePack-02
内置支持类型: 对象序列化 MessagePack for C# 可以序列化你自己定义的公共类或结构体类型。默认情况下,可序列化的类型必须用 [MessagePackObject] 属性进行注解,成员需要用 [Key] 属性进行注解。键可以是索引(整数)…...
【达梦数据库】disql工具参数绑定
前言 在达梦数据库的使用过程中尽管管理工具很好用,但是命令行工具还是有着得天独厚的优势,但是在参数绑定方面就没有管理工具做的更加完美,现在就汇总下disql 工具参数绑定的常用几种方式 disql 参数绑定 使用 ? select * from v$dm_in…...
H5应用抓包及调试技巧
由于图片和格式解析问题,可前往 阅读原文 在现代移动互联网时代,H5 应用以其跨平台、轻量化、快速迭代的特性,成为移动开发的重要一环。然而,随着功能的复杂化和用户体验要求的提升,H5应用的调试也面临着诸多挑战&…...
Django后台新建管理员
在 Django 中,新建管理员用户通常涉及使用 Django 自带的命令行工具 manage.py。以下是具体步骤: 前提条件 Django 项目已创建:确保你已经创建了一个 Django 项目和应用。数据库已迁移:确保你已经运行了 python manage.py migra…...
输入网址到网页显示,发生了什么?
从今天起,我准备在网上输出自己的八股了 浏览器解析URL: 根据URL解析 请求协议(http),请求的服务器(www.baidu.com),请求的文件路径(可以省略),解…...
Coredump-N:sprintf写越界
最近遇到一个sanitizer检查出来的问题; unsigned long abc = 0xffffffffffffffff; char link[8] = {0}; sprintf(link, "%u", abc);这段代码存在潜在问题。 数据类型不匹配: abc 是一个 unsigned long 类型...
自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口)
自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口) 一、final关键字1、认识final关键字2、final修饰变量的注意3、常量 二、单例类(设计模式)1、设计模式的概念2、单例设计模式3、单例类有很多形式4、懒汉式单例类5、小…...
[LeetCode力扣hot100]-二叉树相关手撕题
简单 94.中序遍历 就说左子树-根-右子树顺序,之前也有二叉树相关的文章,基本上递归为主,这里用栈等方式实现下。 用到:栈 注意上面给出节点的基本结构,如左右,val指等 /*** Definition for a binary t…...
docker下部署kong+consul+konga 报错问题处理
前言: 由于在docker下部署一些项目比较特殊,特别是网络这一块,如果没有搞清楚,是很容易出问题的。 先上docker-compose 编排 这里的docker-compose for kong可以在 kong-compose 获取代码 version: 3.9x-kong-config:&kong…...
网络优化工作流程
DT路测 移动测试(Drive Test) CQT 定点测试(通信质量测试) DT 测试不能体现实际话务质量:回音、串音等网络问题不能通过 DT 测试发现,因此 CQT 拨打测试是 DT 测试很好的补充,也是目前室内外测…...
[题解]2024CCPC重庆站-小 C 的神秘图形
Sources:K - 小 C 的神秘图形Abstract:给定正整数 n ( 1 ≤ n ≤ 1 0 5 ) n(1\le n\le 10^5) n(1≤n≤105),三进制字符串 n 1 , n 2 ( ∣ n 1 ∣ ∣ n 2 ∣ n ) n_1,n_2(|n_1||n_2|n) n1,n2(∣n1∣∣n2∣n),按如下方法…...
React入门 - 0.React简介
React入门 - React简介 A Brief Introduction to React By JacksonML 1. 关于React React是一个知名的Web框架。众所周知,jQuery, Angular, Vue等框架都曾闪亮登场,并且,都仍然在全球市场占有一席之地。React这个颇有担当的新锐࿰…...
hive全量迁移脚本
#!/bin/bash #场景:数据在同一库下,并且hive是内部表(前缀的hdfs地址是相同的)#1.读取一个文件,获取表名#echo "时间$dt_jian_2-------------------------" >> /home/hadoop/qianyi_zengliang/rs.txt#…...
SpringCloud系列教程:微服务的未来(二十四)Direct交换机、Topic交换机、声明队列交换机
前言 在现代消息队列系统中,交换机是实现消息传递和路由的核心组件。本文将重点探讨三种常见的交换机类型:Direct交换机、Topic交换机和声明队列交换机。通过对这三种交换机的详细分析,我们将学习它们的工作原理、应用场景以及如何在实际项目…...
Sojson高级加密技术科普
1. 引言 什么是Sojson? Sojson是一款用于JavaScript代码加密与混淆的工具,它能够有效保护前端代码的知识产权,避免开发者的心血被随意窃取。 为什么需要代码加密? 在当今的互联网环境下,代码被轻易复制、篡改或逆向…...
mysql多主集群 galera cluster for mysql 8安装配置启动重启集群
[TOC] 一、安装mysql 1、安装 系统环境: Ubuntu 18.04 64位 MySQL 8.0.19 下载MySQL APT安装配置包 首先访问 https://dev.mysql.com/downloads/repo/apt/ 获取配置包下载地址 wget https://dev.mysql.com/get/mysql-apt-config_0.8.14-1_all.deb sudo dpkg -i mysq…...
gitte远程仓库修改后,本地没有更新,本地与远程仓库不一致
问题 :gitte远程仓库修改后,本地没有更新,本地与远程仓库不一致 现象: [cxqiZwz9fjj2ssnshikw14avaZ rpc]$ git push Username for https://gitee.com: beihangya Password for https://beihangyagitee.com: To https://gitee.c…...
个人搭建CDN加速服务 特网科技
在互联网快速发展的今天,网站的加载速度对用户体验有着至关重要的影响,传统的网页加载方式依赖于服务器的性能和网络环境,这使得某些网站的页面加载时间过长,用户体验不佳,为了解决这个问题,许多企业开始采…...
mybatis 入门案例
前言 我们清楚 mybatis 是一个持久层框架,可以非常便捷的操作数据库。如最常见的对数据进行增删改查操作。 项目准备 1 在mybatis 数据库 创建 user 用户表 并插入以下两条数据 以下是一个user.sql 脚本文件如何使用 脚本文件可以参照MySQL数据库的备份与还原_控…...
Spring Boot最新技术特性深度解析与实战应用
一、反应式编程:WebFlux与非阻塞架构 1.1 核心价值与场景 Spring Boot 2.x全面拥抱反应式编程模型,通过Spring WebFlux支持异步非阻塞的请求处理,适用于高并发、低延迟的微服务场景(如实时通信、物联网数据处理)。其基于Reactor库实现,采用事件循环模型,显著提升资源利…...
Python使用Flask结合DeepSeek开发
一、背景 我之前关于DeepSeek使用ollama部署的文章大家可以把DeepSeek大模型部署起来。那么ollama还提供了可以调用对应部署模型的API接口。我们可以基于这些接口,做自己的二次开发。使用pythonflaskollama就可以进行模型对话调用。并且前端采用SSE的技术࿰…...
前端常见面试题-2025
vue4.0 Vue.js 4.0 是在 2021 年 9 月发布。Vue.js 4.0 是 Vue.js 的一个重要版本,引入了许多新特性和改进,旨在提升开发者的体验和性能。以下是一些关键的更新和新特性: Composition API 重构:Vue 3 引入了 Composition API 作为…...
大模型开发实战篇7:语音识别-语音转文字
语音识别大模型,是人工智能领域的一项重要技术,它能够将人类的语音转换为文本。近年来,随着深度学习技术的不断发展,语音识别大模型取得了显著的进展,并在各个领域得到了广泛应用。 主流语音识别大模型 目前…...
基于JAVA开发APISIX插件实战(1)-开发、部署、调试
我这篇APISIX-JAVA插件实战开编讲述初级工程师才会关心的开发部署调试,主要是因为APISIX-JAVA插件从前文基于JAVA开发APISIX插件-CSDN博客中我们可以了解到,它是通过unix的sock进行RPC的通信的,因此无法生成sock的windows环境是无法进行开发的。 如果使用Mac那么会怎么样?…...
QML 部件获得焦点触发的全局槽函数 onActiveFocusItemChanged
在qml的window窗口中,假如添加里许多其他部件,当这些部件改变时,会有一个全局部件焦点改变槽函数触发,就是 onActiveFocusItemChanged 可以通过此槽函数就可以知道当前焦点在哪一个部件上,也可以做一些自动化测试等&…...
DeepSeek 部署中的常见问题及解决方案:Mac 场景实践指南
DeepSeek 部署中的常见问题及解决方案:Mac 场景实践指南 随着大模型技术的快速发展,DeepSeek 作为开源领域的优秀代表,在本地化部署过程中常会遇到各类技术挑战。本文基于实际部署经验,梳理了五大高频问题及对应解决方案…...
OlympicArena 论文简介
近年来,大型语言模型(LLMs)和大型多模态模型(LMMs)的飞速发展,让AI逐渐展现出接近人类水平的认知推理能力。然而,如何科学评估AI在复杂问题解决中的真实水平,一直是学术界和产业界的…...
你具备数据素养吗?
在这个外卖平台能预测你明天想点什么的时代,当超市货架摆放都经过算法优化时,我们发现:数据素养已不再是专业人员的专利,而是数字公民的基本生存技能。一位小学班主任通过分析学生错题数据优化教学策略,社区便利店老板…...
