优化芋道后台菜单管理卡顿问题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

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

mybatis-plus如何根据任意字段saveOrUpdateBatch

《mybatis-plus如何根据任意字段saveOrUpdateBatch》MyBatisPlussaveOrUpdateBatch默认按主键判断操作类型,若需按其他唯一字段(如agentId、pe... 目录使用场景方法源码方法改造首先在service层定义接口service层接口实现总结使用场景my

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Ubuntu如何升级Python版本

《Ubuntu如何升级Python版本》Ubuntu22.04Docker中,安装Python3.11后,使用update-alternatives设置为默认版本,最后用python3-V验证... 目China编程录问题描述前提环境解决方法总结问题描述Ubuntu22.04系统自带python3.10,想升级

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja