elementPlus + table 树形懒加载 新增,删除,修改 局部刷新

#直接上代码#

 1.表格数据

 2.数据源

<m-table 
ref="cTable" 
v-if="Object.keys(props.tableData).length" 
:options="props.tableOptions"
:data="props.tableData.data" 
:isLoading="props.tableData.loading" 
elementLoadingText="加载中..."elementLoadingBackground="rgba(0,0,0,.8)" 
isEditRow 
lazy 
row-key="id" 
:load="loadTree"
:tree-props="{ children: 'lstChildrenModule', hasChildren: 'hasChildren' }"
:header-cell-style="props.tableClass.headerCellStyle" 
border><!--操作栏--><template #subAction="scope"><el-tooltip effect="dark" content="添加子菜单" placement="top-start"><el-button circle :icon="Plus" size="small" type="primary"@click="toMenuEditAdd(scope.scope.row, 'subAdd')"></el-button></el-tooltip><el-tooltip effect="dark" content="修改平台" placement="top-start"><el-button circle :icon="Edit" size="small" type="primary"@click="toMenuEditAdd(scope.scope.row, 'edit')"></el-button></el-tooltip><el-tooltip effect="dark" content="删除平台" placement="top-start"><el-button circle :icon="Delete" size="small" type="danger"@click="onRowDel(scope.scope.row, 'del')"></el-button></el-tooltip></template><!--操作栏--></m-table>

3 运行结果

4.初始化懒加载数据

let cTable = ref();
const loadMap = new Map();
/*** 懒加载菜单* @times 2023-09-04 16:46* @link https://blog.csdn.net/a4561614* @param {row,treeNode,resolve}* @returns []* @method loadTree 懒加载菜单*/
const loadTree = async (row, treeNode, resolve) => {let obj = {"moduleNo": "",      //模块编号"moduleName": "",    //模块名称"parentNo": row.moduleNo,      //父编号"appNo": row.appNo,         //平台编号"isDelete": false}let res = await useMenuApi().getModulesAll(obj)setTimeout(() => {//将获取到的节点数据添加到loadMap缓存中,用于每次操作节点时进行过滤判断loadMap.set(row.moduleNo, { row, treeNode, resolve });resolve(res.results)}, 1000)
};

5,全局添加/子菜单添加/编辑

//引入每次点击保存再数据管理层用于判断更新节点import { paremData } from '/@/stores/paremData';/**
* @author ken
* @version 1.0
* @method addMenuEditModal  弹窗
* @description 新增菜单
*/
let addMenuEditModal = (row,type) => {state.menuData.type = type;// menuRef.value?.restForm();//如果是菜单添加时,当前行的模块名称为父节点parentNo数据//如果是编辑时,当前行的模块名称为模块名称,当前行的父节点parentNo为parentNo数据state.menDefaultsData=type=='edit'?row:{}state.menDefaultsData.parentNo= type=='add'?'': (type=='edit'?row.parentNo:row.moduleNo);//如果是点击编辑和新增子菜单时存入当前行的row数据paremData().setTreeRow((type=='edit' || type=='subAdd' )?row: {});state.menuData.title =type=='edit'?"编辑菜单": "添加菜单";state.menuData.okTxt = type=='edit'?"确定编辑": "确定";menuDialogVisibles.value = true;
}/*** @author ken* @version 1.0* @param   {form}* @method confirmMenuData  * @description  新增菜单提交数据*/
const confirmMenuData = (form)=>{let validate = form.validate()let model = form.getFormData()validate(async (valid) => {if (valid) {if(model.parentNo instanceof Array){model.parentNo=model.parentNo.toString();}if(!model.appNo){model.appNo=paremData().getAppNo?paremData().getAppNo:row.appNo;}let res = await useMenuApi().moduleSaveOrUpdate(model)if (!res.hasErr) {menuDialogVisibles.value = false;ElMessage.success(res.msg);//如果是子菜单添加,通过当前点击的行内数据hasChildren判判断是否存在二级或者多级数据,当为true时 取parentNo作为父节点,为false 吧moduleNo为父节点//通过parentNo,moduleNo 到 loadMap 去缓存中查找数据,然后通过查找出来的数据中取 (id ,因为table中定义了 row-key="id")进行过滤重置或者清除Tree缓存数据,//如果不存在就直接刷新当前页面if(option.menuData.type=='subAdd' || option.menuData.type=='edit'){let row=paremData().getTreeRow;containerSideRef.value.reloadTree(row.hasChildren==false?row.parentNo:row.moduleNo);}if(option.menuData.type=='add'){getModulesPageData();}menuRef.value?.restForm()} else {ElMessage.error(res.msg);}}})
}/*** @author ken* @version 1.0* @param   {row,type}//当前行的数据,类型为删除* @method removeMenuData  * @description  删除子节点后,去刷新页面*/
const removeMenuData = (row,type)=>{ElMessageBox.confirm(`此操作将永久删除:${row.moduleName}, 是否继续?`, '提示', {confirmButtonText: '删除',cancelButtonText: '取消',type: 'warning',}).then(async() => {let res=await useMenuApi().removeModules({moduleNo:row.moduleNo,isDelete:true});if(!res.hasErr){containerSideRef.value.reloadTree(row.parentNo);ElMessage.success('删除成功');}else{ElMessage.error(res.msg)}}).catch(() => {});
}/*** @times 2023-09-04 16:46* @link https://blog.csdn.net/a4561614* @param {parentNo}* @returns []* @method reloadTree 重新懒加载菜单栏*/
const reloadTree = (parentNo) => {parentNo = parentNo ? parentNo : '';//从const loadMap = new Map();判断是否存在let objs = loadMap.get(parentNo);if (objs == undefined || objs == '') {//刷新页面emits('refresh-menu-data')} else {//执行通过id清除缓存中的数据const { row, treeNode, resolve } = objs;cTable.value.removeCacheTree(row.id);//重新懒加载一次loadTree(row, treeNode, resolve);}
};/*** @author ken* @version 1.0* @param  row   刷新子节点数据* @method removeCacheTree  清除事件* @description  //刷新子节点数据*/
const removeCacheTree=(id)=>{//通过ref获取table的子节点数if (table_ref.value.store.states.lazyTreeNodeMap.value[id].length > 1) {//说明该节点下有多个子节点table_ref.value.store.states.lazyTreeNodeMap[id] = [];} else {//说明该节点只有一个节点table_ref.value.store.states.lazyTreeNodeMap.value[id] = [];}
}

6.paremData.js

import { defineStore } from 'pinia';/*** 参数数据管理* @methods setParemData 设置参数数据管理*/
export const paremData = defineStore('paremStoreData', {state: () => ({treeRow:{}//树形菜单当前行缓存}),getters:{getTreeRow(state){return state.treeRow}},actions: {setTreeRow(row){//存储树形行菜单数据this.treeRow=row;}},
});

 !完结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/101360.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

报错:axios 发送的接口请求 404

axios 发送的接口请求 404 一、问题二、分析 一、问题 二、分析 axios 发送的接口请求 404&#xff0c;根本没有把接口信息发送到后端&#xff0c;这个时候你可以查看检查一下自己的接口名字&#xff0c;或让后端配合换一个接口名字再发送一次接口请求 或者重启一下电脑 我是…

NATAPP使用详细教程(免费隧道内网映射)

NATAPP - https://natapp.cn/tunnel/lists NATAPP 在开发时可能会有将自己开发的机器上的应用提供到公网上进行访问&#xff0c;但是并不想通过注册域名、搭建服务器&#xff1b;由此可以使用natapp&#xff08;内网穿透&#xff09; 购买免费隧道 修改隧道配置 看自己的web…

2023百度云智大会:科技与创新的交汇点

​ 这次的百度云智大会&#xff0c;可谓是亮点云集—— 发布了包含42个大模型、41个数据集、10个精选应用范式的全新升级千帆大模型平台2.0&#xff0c;发布首个大模型生态伙伴计划&#xff0c;而且也预告了文心大模型4.0的发布&#xff0c;大模型服务的成绩单也非常秀&#x…

Unity中神秘的Transform和transform(小写)的关系

1.为什么Transform类是保护的不能通过new 来实例化对象,也没有静态函数,而Rotate()这种方法却属于它,该如何访问? Transform 类还是被保护的不允许用户修改! protected Transform(); 是一个受保护的构造函数,不能直接实例化 Transform 类。 2.为甚么transform可以访问Tr…

IDEA集成Apipost Helper实现一键部署接口(避免参数注释)

先说好处&#xff1a; 1.一次性导入所有接口&#xff0c;不要一个一个扒。 2.对于字段的注释不要一个一个的去手写&#xff0c;映射实体类&#xff0c;自己上传&#xff08;最重要&#xff09;。 3.目录自动归类划分&#xff0c;避免接口混乱。 安装插件 首先&#xff0c;我们打…

自建音乐服务器Navidrome之二

开源音乐服务器 自建音乐服务器Navidrome之一 自建音乐服务器Navidrome之二 开源音乐服务器6 准备音乐资源 可选Last.fmSpotify 7 安装 Docker启动 docker 8 安装音乐服务器9 音乐上传使用miserver上传启动音乐服务器浏览器访问:账号10 Navidrome 第三方客户端SubstreamerSubt…

IDEA中Run/Debug Configurations添加VM options和Program arguments

1. 现象描述 我在我的IDEA当中打开配置模板后&#xff0c;发现没有VM options和Program arguments&#xff0c;也就是虚拟机选项和程序实参这两项&#xff0c;导致我不能配置系统属性参数和命令行参数&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff0…

Kotlin

函数命名 针对您目前为止学到的 Kotlin 知识&#xff0c;下面给出了一些相关样式指南&#xff1a; 函数名称应采用驼峰式大小写形式&#xff0c;并且应该是动词或动词短语。每个语句都应单独占一行。左花括号应出现在函数开始行的末尾。左花括号前应有一个空格。 变量声明 变…

2023全国大学生数学建模ABCDE选题建议,思路模型,小白要怎么选?难度怎么样

首先最重要的&#xff0c;难度C<B<A&#xff0c;D、E题推荐选E题 大家可以查看我们的视频讲解&#xff0c;在这里&#xff1a;【2023全国大学生数学建模竞赛选题建议&#xff0c;难度分析&#xff0c;小白应该怎么选】 https://b23.tv/S6O26uc 选题建议视频播放​b23.t…

2023高教社杯 国赛数学建模A题思路 - 定日镜场的优化设计

1 赛题 A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统&#xff0c; 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件&…

Linux系统中实现便捷运维管理和远程访问的1Panel部署方法解析

文章目录 前言 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、文件管理、数据库管理、容器管理等下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理…

OCR训练部署文档

Cuda安装 wget https://developer.download.nvidia.com/compute/cuda/11.6.0/local_installers/cuda_11.6.0_510.39.01_linux.run sh cuda_11.6.0_510.39.01_linux.run#可能会报错&#xff0c;查看/var/log/nvidia-installer.log &#xff0c;kill -9 [ID]可以解决vim ~/.bash…