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

文章讲述了在菜单管理页面遇到的性能问题,首先尝试通过压缩数据传输来优化,但效果有限。接着采用懒加载策略,仅在用户需要时加载子菜单,利用ElementUi的表格组件实现该功能,显著提升了页面打开速度。然而,这也导致了菜单更新后页面未同步的问题,解决方案是通过PID动态获取并更新子菜单数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

过程:

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

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

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

<el-table
    :data="tableData1"
    style="width: 100%"  
    row-key="id"
    border
    lazy
    :load="load"  
    :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
    <el-table-column
      prop="date"
      label="日期"
      width="180">
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      width="180">
    </el-table-column>
    <el-table-column
      prop="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去重下.

### 如何在 Activiti 工作流引擎中动态新增任务节点 #### 方法概述 为了实现动态添加任务节点的功能,通常的做法是在流程定义阶段预留一定的灵活性。这可以通过使用包容网关(Inclusive Gateway)或事件子流程(Event Subprocess),使得可以在运行时向现有路径注入新的任务。 另一种方法是利用Activiti提供的API接口,在特定条件下创建并链接新的人工任务至当前正在执行的流程实例上。这种方式允许更灵活的任务分配机制[^1]。 #### 实现方式一:通过 API 动态增加任务 如果希望直接操作数据库表来达到目的,则推荐这样做;相反应该借助于`RuntimeService` 和 `TaskService` 来完成此目标。下面是一个简单的例子展示如何基于已有流程实例 ID 创建额外的任务: ```java // 假设 processInstanceId 是已知的 String processInstanceId = "some-process-instance-id"; // 使用 TaskService 添加新任务 taskService.createTask().name("Dynamic Task").assignee("johnDoe") .setVariableLocal("dynamicTaskDescription", "This is a dynamically added task.") .executionId(processInstanceId).save(); ``` 这段代码片段展示了怎样在一个给定的流程实例上下文中引入一个新的待办事项列表项,并将其指派给某位员工处理。注意这里并没有改变原有的 BPMN 流程模型本身,而是临时性地增加了工作任务[^3]。 #### 实现方式二:修改 XML 或 JSON 表达式的流程定义文件 对于更加复杂的场景,可能需要实际更改存储在数据库中的BPMN 2.0 XML 文档或者JSON表达式格式的过程描述符。这种情况下应当谨慎行事,因为任何错误都可能导致整个应用程序崩溃。建议先备份原始版本再尝试编辑。完成后记得调用相应的服务更新缓存以便使改动生效。 ```xml <!-- Example of adding an user task element into existing flow --> <userTask id="newUserTask" name="New User Task"> <extensionElements> <!-- Custom extensions can be defined here as needed --> </extensionElements> </userTask> <bpmn:sequenceFlow sourceRef="previousActivity" targetRef="newUserTask"/> <bpmn:sequenceFlow sourceRef="newUserTask" targetRef="nextActivity"/> ``` 上述XML片断说明了如何将一个人工活动插入到两个现有的环节之间。当然这只是示意性的写法,具体细节取决于所使用的建模工具以及具体的业务逻辑需求[^5]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值