优化芋道后台菜单管理卡顿问题element-plus版本

2024-09-01 13:20

本文主要是介绍优化芋道后台菜单管理卡顿问题element-plus版本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.原因分析

芋道后台菜单管理使用element-plus的table组件进行页面显示。因一次加载数据太多导致页面需全部进行渲染非常卡顿。

处理方案:1、修改页面数据只渲染父级。

2.dome源代码

    <el-tablev-if="refreshTable"v-loading="loading":data="list":default-expand-all="isExpandAll"row-key="id"lazy:load="load":tree-props="{ children: 'children', hasChildren: 'hasChildren' }"><el-table-column :show-overflow-tooltip="true" label="菜单名称" prop="name" width="250" /><el-table-column align="center" label="图标" prop="icon" width="100"><template #default="scope"><Icon :icon="scope.row.icon" /></template></el-table-column><el-table-column label="排序" prop="sort" width="60" /><el-table-column :show-overflow-tooltip="true" label="权限标识" prop="permission" /><el-table-column :show-overflow-tooltip="true" label="组件路径" prop="component" /><el-table-column :show-overflow-tooltip="true" label="组件名称" prop="componentName" /><el-table-column label="状态" prop="status" width="80"><template #default="scope"><dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /></template></el-table-column><el-table-column align="center" label="操作"><template #default="scope"><el-buttonv-hasPermi="['system:menu:update']"linktype="primary"@click="openForm('update', scope.row.id)">修改</el-button><el-buttonv-hasPermi="['system:menu:create']"linktype="primary"@click="openForm('create', undefined, scope.row.id)">新增</el-button><el-buttonv-hasPermi="['system:menu:delete']"linktype="danger"@click="handleDelete(scope.row.id)">删除</el-button></template></el-table-column></el-table>

3.JS代码源代码

 

<script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { handleTree} from '@/utils/tree'
import * as MenuApi from '@/api/system/menu'
import MenuForm from './MenuForm.vue'
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'defineOptions({ name: 'SystemMenu' })const { wsCache } = useCache()
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗const loading = ref(true) // 列表的加载中
const list = ref<any>([]) // 列表的数据-只有父节点数据
const listTree = ref<any>([]) // 列表的数据-只有父节点数据
const listChildren=ref<any>([]) //处理children原数据
const queryParams = reactive({name: undefined,status: undefined
})
const queryFormRef = ref() // 搜索的表单
const isExpandAll = ref(false) // 是否展开,默认全部折叠
const refreshTable = ref(true) // 重新渲染表格状态
import { cloneDeep } from 'lodash-es'
/** 查询列表 */
const getList = async () => {loading.value = truetry {const data = await MenuApi.getMenuList(queryParams)listTree.value= handleTree(data)const tree=cloneDeep(listTree.value)tree.forEach((itme)=>{if(itme.children){itme.hasChildren=truedelete itme.children}})list.value=tree} finally {loading.value = false}}//加载子节点
const load = (row: any,_treeNode: any,resolve: (date: any[]) => void
) => {listChildren.value=[]getChildren(cloneDeep(listTree.value),row)let children = listChildren.valuesetTimeout(()=>{if(children){resolve(children)} },100)}//获取子节点数据
const getChildren=(arr,row)=>{arr.forEach(element => {if(row.id===element.parentId){listChildren.value.push(element)if(element.children?.length){element.hasChildren=truedelete element.children}}if(element.children?.length){getChildren(element.children,row)}});
}/** 搜索按钮操作 */
const handleQuery = () => {getList()
}/** 重置按钮操作 */
const resetQuery = () => {queryFormRef.value.resetFields()handleQuery()
}/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number, parentId?: number) => {formRef.value.open(type, id, parentId)
}/** 展开/折叠操作 */
const toggleExpandAll = () => {refreshTable.value = falseisExpandAll.value = !isExpandAll.valuenextTick(() => {refreshTable.value = true})
}/** 刷新菜单缓存按钮操作 */
const refreshMenu = async () => {try {await message.confirm('即将更新缓存刷新浏览器!', '刷新菜单缓存')// 清空,从而触发刷新wsCache.delete(CACHE_KEY.USER)wsCache.delete(CACHE_KEY.ROLE_ROUTERS)// 刷新浏览器location.reload()} catch {}
}/** 删除按钮操作 */
const handleDelete = async (id: number) => {try {// 删除的二次确认await message.delConfirm()// 发起删除await MenuApi.deleteMenu(id)message.success(t('common.delSuccess'))// 刷新列表await getList()} catch {}
}/** 初始化 **/
onMounted(() => {getList()
})
</script>

4、主要修改源代码

1、:load="load" 和对数据:tree-props进行赖加载处理

 

这篇关于优化芋道后台菜单管理卡顿问题element-plus版本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127050

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言