vue使用el-table实现懒加载树. 解决新增、删除、修改之后数节点不刷新问题

news/2024/11/23 4:04:06/

问题: 菜单管理页面,打开耗时7.8秒

有2200多个菜单, 请求接口返回700k的数据, 领导说返回的数据量太大了, 让改造下. 

过程:

        尝试一: 想着能少改就少改的原则. 700k你嫌大, 那咱就压缩下数据传输.  修改完之后接口返回数据size60多k, 但是管理菜单打开的时间只优化了一点.  这个压缩传输的博客还没写//TODO 

        尝试二: 其实线上服务器资源的这个接口, 在命中缓存的情况下查询耗时也不算长, 主要时间耗费在渲染表格上面. 另外结合业务:菜单管理. 只有管理员才有权限,一般是有新功能上线新增菜单, 或者下线菜单, 并没有一次性加载所有菜单的必要. 

         所以我们将菜单(table)加载改为懒加载. 改需求结合ElementUi组件很容易实现, 可以去查看文档. 大体思路就是 初始化打开页面时只显示第一级菜单, 用户点击展开菜单之后往后端发送请求,然后加载出一级子菜单. 后台只用有一个根据菜单id查询他子菜单的接口就可以

<el-table:data="tableData1"style="width: 100%"  row-key="id"borderlazy:load="load"  :tree-props="{children: 'children', hasChildren: 'hasChildren'}"><el-table-columnprop="date"label="日期"width="180"></el-table-column><el-table-columnprop="name"label="姓名"width="180"></el-table-column><el-table-columnprop="address"label="地址"></el-table-column></el-table>data() {return {tableData1: [{id: 1,date: '2016-05-02',name: '王小虎',address: '上海市普陀区金沙江路 1518 弄'}, {id: 2,date: '2016-05-04',name: '王小虎',address: '上海市普陀区金沙江路 1517 弄'}, {id: 3,date: '2016-05-01',name: '王小虎',address: '上海市普陀区金沙江路 1519 弄',hasChildren: true                   //该字段为true的,父菜单才有下级的小箭头可以点击,代表还有子菜单}, {id: 4,date: '2016-05-03',name: '王小虎',address: '上海市普陀区金沙江路 1516 弄'}]}
}methods: {load(tree, treeNode, resolve) {             //tree 我们点击的行数据...调用接口获得改菜单的子菜单 getChildMenu(tree.id).then((res) => {   //getChildMenu是我们自己的调用后台的封装resolve(                            //resolve是组件的res.content  //根据自己的格式,将查到的子菜单数组填充)})}
}

改完很OK, 秒开, 加载很快. 子菜单加载一次之后就被缓存了,在怎么点击也不会重新去请求后台.  这个也导致了在我们增删改排序等操作菜单之后, 页面对应的菜单节点没有更新, 实际数据已变更. 整体刷新一下页面的话会显示正确, 不过不可能每次更新之后,强制刷新页面吧.

 那我们要做的就很清晰了: 修改了哪一行, 就拿到这一行数据的PID, 然后去调用接口,查到这个PID下一级子菜单,查到数据之后塞回去就行了. 接口和页面加载的那个接口是复用的, 无非页面加载的时候PID传的是0.

reflushtable(crud,pid){ //解决菜单懒加载时.  更新,添加,删除 排序不更新的情况crudMenu.getMenusByPid(pid).then((res) => {this.$set(this.$refs.table.store.states.lazyTreeNodeMap, pid, res.content)})
},//this.$refs.table 注意这个table是你的table属性:ref的名字.
//没有一丝丝技巧, 全靠面向搜索引擎, 这玩意藏那么深谁能找到^^

剩下的就根据自己的实现, 在新增,删除,编辑方法之后,或钩子之后. 去拿父ID查数&set. 
在提一嘴 如果有批量删除功能的话, 要注意拿PID循环调用下, 要不然会存在刷新不到的地方.  当然最好将PID去重下.


http://www.ppmy.cn/news/146114.html

相关文章

1079 三角形

Description 著名的数学家毕达哥拉斯可能从来都不曾想过有人居然会问他这样的一个问题&#xff1a;给出一个整数&#xff0c;存在多少个直角三角形&#xff0c; 它的某一条边的长度等于这个整数&#xff0c;而且其他边的长度也是整数。既然毕达哥拉斯不可能预见到有计算机的出…

磁带机大概使用

HP StorageWorks Ultrium 驱动器的默认 SCSI ID 为 3。SCSI 总线上的每个设备都必须有一个唯一的 SCSI ID 号。可以为驱动器分配 0 到 15 之间的任何未使用的 ID。不要使用 SCSI ID 7&#xff0c;它是为 SCSI 控制器保留的。SCSI ID 0 通常分配给引导磁盘&#xff0c;除非磁带驱…

惠普磁带备份机支持备份几台服务器,03-惠普磁带自动备份产品家族.ppt

03-惠普磁带自动备份产品家族 October 2003 October 2003 Presentation Title 惠普入门级数据保护方案及备份策略 惠普数据归档解决方案 惠普磁带自动备份产品家族 数据保护神&#xff0d;惠普OVDP 5.5 惠普IP SAN解决方案 惠普入门SAN解决方案 惠普虚拟存储解决方案 2006年第一…

linux查看磁带大小命令,16条实用的Linux/Unix 磁带管理命令

在本教程中你将会了解到&#xff1a; 磁带设备名 管理磁带驱动器的基本命令 基本的备份和恢复命令 为什么备份? 一个备份计划对定期备份文件来说很有必要&#xff0c;如果你宁愿选择不备份&#xff0c;那么丢失重要数据的风险会大大增加。有了备份&#xff0c;你就有了从磁…

HPUX磁带管理命令及常见应用

从用户的角度来看&#xff0c;unix的任何设备都可以看做是文件。因此&#xff0c;可以“打开”合适的磁带驱动器文件来进行写入操作&#xff0c;将要备份的数据写入到文件中去。虽然这听上去过于简单了&#xff0c;但是实际情况就是这样。Unix系统把每一个设备都看成一个文件&a…

oracle磁带库清洁带标签,分享那些在磁带库上爬过的坑

原标题&#xff1a;分享那些在磁带库上爬过的坑 来自社区会员分享案例 5 则&#xff0c;均是磁带库日常运维中的典型故障。 在STK L180磁带库上爬过的坑 故事发生在几年前&#xff0c;在更换机房的一组光纤交换机的实施过程中&#xff0c;原光纤交换机因使用超限&#xff0c;决…

磁带机常识

磁带机经过一段时间的使用后一般需要清洗 例子HP StorageWorks Ultrium 920主面板上会有clean灯不停闪烁 清洗必须要使用专用清洗带 清洗带一般有使用次数限制一般为15次 (HP真不厚道,配过来的软件还是60天试用版) 转载于:https://blog.51cto.com/nicholasxp/159375

磁带机技术的应用解析

磁带机&#xff08;Tape Drive&#xff09;一般指单驱动器产品&#xff0c;通常由磁带驱动器和磁带构成&#xff0c;是一种经济、可靠、容量大、速度快的备份设备。这种产品采用高纠错能力编码技术和写后即读通道技术&#xff0c;可以大大提高数据备份的可靠性。根据装带方式的…