zoukankan      html  css  js  c++  java
  • easyui-tree/combotree 子节点前端懒加载(主要解决ie11下加载慢

    场景

    最近在项目开发上遇到了easyui-comboxtree (下拉树)在IE11下加载缓慢、导致页面卡顿的情况,对比分析了一下发现,树的数据量越大页面加载就越缓慢。由于数据是一次性塞到组件上的,把大量树形数据递归转换成树形dom再渲染到页面上,必然会导致页面的性能问题。因此选择使用子节点懒加载方式解决。

    官方文档里采用的懒加载方式是通过 url 属性和后台服务配合实现的,我看不懂而且也没有现成的接口可以用,只有一个接口能一次性拿到所有数据,基于目前的条件只能做一个伪懒加载,但至少可以解决ie11下的加载问题。

    树形数据结构

    var treeData = [
        {
            id: '1',
            parentId: '0',
            text: '兰州新区',
            state: 'closed',
            children: [
                {
                    id: '11',
                    parentId: '1',
                    text: '秦川园区',
                    state: 'closed',
                    children: [
                        {
                            id: '111',
                            parentId: '2',
                            text: '新昌村',
                            state: 'closed',
                            children: []
                        }
                    ]
                }, {
                    id: '12',
                    parentId: '1',
                    text: '中川园区',
                    state: 'closed',
                    children: [] 
                }
            ]
        }
    ]
    
    
    
    

    递归树查询(根据id查询节点下的子节点数据

    //data-树形数据 id-要查询的节点
    function findTreeChildNodes(data, id){
        if(data.id == id) return data.children
        for(var i =0; i < data.children.length; i++){ //ie11不支持es6 支持的环境可以用of语法遍历 
            var res = findTreeChildNodes(data.children[i], id)
            if(res) return res
        }
    }
    

    easyui-combotree/tree 的配置

    var rootNode = JSON.parse(JSON.stringify(treeData))
    rootNode.children = []//初始化只渲染根节点数据
    $('#cb-tree').combotree({
        data: rootNode,
        onBeforeExpand: function(node){
            if(node.isLoaded) return
            var childs = findTreeChildNodes(treeData[0], node.id)
            childs.map(function(){
                if(e.children.length){
                    e.children = []//清空获取的子节点数据下的孙子节点 否则会把子级全部加载出来 如果数据量大 会造成卡顿
                    e.state = 'closed'
                }
            })
            var tree = $('#cb-tree').combotree('tree')//如果是tree组件 使用$('x').tree()即可
            tree.tree('append', {
                parent: node.target,
                data: childs
            })
            //标记此节点已经加载过数据
            tree.tree('update', {
                target: node.target,
                isLoaded: true
            })
        }
    })
        
    

    到这里 easyui 树形控件的子节点伪懒加载功能就已经完成了,实现真正的懒加载还是需要后台接口来配合。首先,我们这里一开始就加载全部数据,造成了数据资源浪费;其次,前端本不应该负责大数量的数据处理。

  • 相关阅读:
    iOS --有行距的图文混排
    iOS 。开发之指纹识别功能
    ios UICollectionView reloadData无法更新的奇怪问题。
    ios
    ios
    iOS --随机打乱一个数组的顺序 获得一个新的数组
    PYTHON -转载,获取淘宝数据01
    ios . -- UICollectionView --cell 自适应
    Web 四种常见的POST提交数据方式
    Objective-C 谈谈深浅拷贝,copy和mutable copy都不是完全拷贝
  • 原文地址:https://www.cnblogs.com/qimeng/p/11208693.html
Copyright © 2011-2022 走看看