树形table 10w+数据每次点击要十几秒 懒加载解决点击卡顿

el-table
树形table 10w+数据每次点击要十几秒 懒加载解决点击卡顿

//vue 表头要增加lazy :load="load"
<el-table
          lazy
          stripe
          border
          ref="table"
          row-key="id"
          :load="load"
          :data="tableData"
          :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" 
          style="width: 100%"
          :height="tableHeight"
        >
请求树
handleQuery() {
      //GetTree为数据接口
      GetTree().then(res => {
        if (res.errorCode === "000000") {
            this.total = res.data.length
            //备份所有的数据
            const list = res.data || [];
            const listFun = (ele, level) => {
                //因为系统最多能添加五级,增加了叶子节点
                if (level >= 5) {
                    ele.leafFlag = true;
                } else {
                    ele.leafFlag = false;
                }
                if (ele.children && ele.children.length > 0) {
                    level = level + 1;
                    ele.children.map((childEle) => {
                        listFun(childEle, level);
                    });
                } else {
                    delete ele.children;
                }
            };
            list.map((element) => {
                let level = 1;
                listFun(element, level);
            });
            this.tableDataCopy = list;
            const listCopy = JSON.parse(JSON.stringify(list));
            //初始化表格展示一级类目
            this.tableData = listCopy.map((item) => {
                item.hasChildren = item.children && item.children.length > 0;
                item.children = null;
                item.levelIdList = [item.id];
                return item;
            });
        }
      })
    },
load (row, treeNode, resolve) {
    // 层级关系备份
    const idCopy = JSON.parse(JSON.stringify(row.levelIdList))
    // 查找下一层数据
    let resolveArr = this.tableDataCopy
    let id
    // eslint-disable-next-line
    while (id = row.levelIdList.shift()) {
        const tarItem = resolveArr.find(item => item.id === id);
        tarItem.loadedChildren = true
        resolveArr = tarItem.children
    }

    // 处理下一层数据的属性
    resolveArr = JSON.parse(JSON.stringify(resolveArr))
    resolveArr.forEach(item => {
        item.hasChildren = item.children && item.children.length > 0;
        item.children = null;
        // 此处需要深拷贝,以防各个item的levelIdList混乱
        item.levelIdList = JSON.parse(JSON.stringify(idCopy))
        item.levelIdList.push(item.id)
    })

    // 标识已经加载子节点
    row.loadedChildren = true
    // 渲染子节点
    resolve(resolveArr)
},

在这里插入图片描述
无需等待 点击一下就出来了

这种情况可能是因为你没有正确配置 el-table 的异步加载数据源。在 el-table 中使用树形数据时,需要通过 `lazy` 属性来开启异步加载,并通过 `load` 属性指定加载数据的方法。在加载数据的方法中,需要指定参数 `node` 来表示当前要加载的节点,以便根据节点信息从服务器获取对应的子节点数据。如果数据加载成功,需要将数据通过回调函数返回给 el-table 组件,以便渲染出树形结构。 以下是一个示例代码: ```html <el-table :data="treeData" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" :lazy="true" :load="loadData"> <el-table-column prop="name" label="名称"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> ``` ```javascript export default { data() { return { treeData: [], }; }, methods: { loadData(node, resolve) { // 从服务器获取子节点数据 axios.get('/api/getChildren', { params: { id: node.id } }) .then(response => { // 将子节点数据返回给 el-table 组件 resolve(response.data); }) .catch(error => { console.error(error); // 加载失败时需要调用 resolve 方法并传入空数组,以便 el-table 组件正确处理 resolve([]); }); }, }, }; ``` 在上面的代码中,`treeData` 是树形结构的数据源,`loadData` 方法是用来加载子节点数据的回调函数。在 el-table 组件中,通过 `:tree-props` 属性来指定树形结构的属性名,如 `children` 和 `hasChildren`,以便 el-table 组件正确渲染出树形结构。同时,需要将 `lazy` 属性设置为 `true`,以开启异步加载功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值