惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Cloudflare Blog
U
Unit 42
F
Fortinet All Blogs
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
月光博客
月光博客
Y
Y Combinator Blog
罗磊的独立博客
V
Visual Studio Blog
大猫的无限游戏
大猫的无限游戏
J
Java Code Geeks
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
爱范儿
爱范儿
B
Blog RSS Feed
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
I
InfoQ
博客园 - 叶小钗
博客园 - 聂微东
Last Week in AI
Last Week in AI

博客园 - 信息技术的风采

一次 RFID 快速传感速率问题排查复盘:同一个 exe,为什么 VS Debug 快、双击运行慢? 三层内链内容建设方法:从软文堆砌到主题集群 GitHub 主仓库同步到部署仓库,再对接 Vercel:一次完整的部署与排障实录 MD5哈希生成:原理、应用与在线工具指南 Cursor与Claude 3.7开发体验差异分析 ModBus功能码异常和功能码错误代码 解决在VirtualBox中的Windows 10系统无法双向复制的问题 使用Nexus搭建Nuget服务以及生成nuget包遇到的一些坑 使用VS2017开发APP中使用VUE.js开发遇到打包出来的android文件 在低版本的android(4.3)中无法正常使用 如何使cmd窗口正确显示utf-8编码的文字 Linux 安装 git 使用 .net WEBAPI 返回 application/json类型导致 IE8 提示下载 关于 C#的一些记录 关于tinymce的一些记事 个人使用uploadify插件遇到的一些问题 ASP.NET中Session的个人浅谈 QL Server 创建用户时报错:15023 用户,组或角色'XXX'在当前数据库中已存在? 运行cmd时提示你可能没有适当的权限访问该项目 使用Flash Builder 4.6出现 新建配置 失败 java.lang.NullPointerException错误 CMD命令进入某个目录 使用 CKEditor编辑插件
前端BootstrapTable组件不同使用方法的效率各有差异
信息技术的风采 · 2021-07-07 · via 博客园 - 信息技术的风采

本人需要解决的问题(#需求)

设备端批量发送数据过来,数据已按照特定字段进行排序,现在本人需要按照传过来的数据动态更新表格,表格的显示区域有限制
因为一些原因,最终确定使用 Bootstrap Table 组件实现该功能

遇到的问题(#问题)

使用 bootstrapTable('load', {data: data})进行数据更新时,无法使用滚动条。每次刷新滚动条都会恢复到滚动条顶部(即无法滑动滚动条,体验很差)
使用 bootstrapTable('updateRow', {index : updateIndex, row : showRow}) 动态维护数据时,占用CPU太多(30%+),导致 浏览器的IndexedDB数据库无法使用等问题
使用 bootstrapTable('updateByUniqueId', {id: id, row : showRow}) 动态维护数据时,占用CPU太多(30%+),导致 浏览器的IndexedDB数据库无法使用等问题

测试前端页面(#基本页面)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <!-- Jquery 引用 -->
        <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>

        <!-- bootstrap && bootstrap-table -->
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" rel="stylesheet">
        <link href="https://unpkg.com/bootstrap-table@1.18.3/dist/bootstrap-table.min.css" rel="stylesheet">
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.min.js"></script>
        <script src="https://unpkg.com/bootstrap-table@1.18.3/dist/bootstrap-table.min.js"></script>
        
    </head>
    <body>
        <div id="table-wrapper">
        <table id="table"
            data-toggle="table"
            data-show-columns="true"
            data-height="300"
            data-unique-id="uid"
        >
            <thead>
                <tr>
                      <th data-field="id">ID</th>
                      <th data-field="name">Item Name</th>
                      <th data-field="price">Item Price</th>
                </tr>
            </thead>
        </table>
        </div>
        <script>
      //  解决思路代码放在该处

          var $table = $('#table');
          var times = 0;
          var total = 0;
          var maxTotal = 0;


          function refresh(){
              //  问题代码
          }
          $(function() {
              setInterval(() =>{refresh();}, 2000);
          });

        </script>
    </body>
</html>

本人使用的基本思路

测试时的数据对象基本对象结构为 { 'id' : id, 'uid' : uid, 'name' : name, 'price' : price}

生成空对象的方法如下

function generateRow()
{
    var result = {
        'id' : 0
        , 'uid' : 0
        , 'name' : ''
        , 'price' : ''
      };
    return result;
}

Mock数据生成方法如下

function generateData()
{
    var data = [];
    let len = 20 + Math.floor(Math.random() * 30);
    for(let i = 0; i<len; i++)
    {
        let id = total + i + 1;
        data.push({
            'id' : id
            , 'uid' : (i+1)
            , 'name' : 'Item' + id
            , 'price' : '$' + id
        });
    }
    return data;
}
  • 问题一 实现代码

function refresh()
{
    var data = generateData();
    total += data.length;
    //  动态更新数据
    $table.bootstrapTable('load', data);
}

问题录屏

无法正确使用滚动条

无法正确使用滚动条

内存占用率

内存占用率
  • 问题二 实现代码

function refresh()
{
    var data = generateData();
    var len = data.length;
    total += len;
    let updateIndex = 0;
    //  动态更新数据
    for(; updateIndex<maxTotal; updateIndex++)
    {
        let showRow = updateIndex<len ? data[updateIndex] : generateRow();
        $table.bootstrapTable('updateRow', {
            index : updateIndex
            , row : showRow
        });
    }
    //  插入数据
    for(;updateIndex<len; updateIndex++)
    {
        $table.bootstrapTable('insertRow', 
        {
            index : updateIndex
            , row : data[updateIndex]
        });
    }
    maxTotal = maxTotal >= len ? maxTotal : len;
}

问题截屏
CPU占用过高

CPU占用过高
  • 问题三 实现代码

function refresh()
{
    var data = generateData();
    var len = data.length;
    total += len;
    let updateIndex = 0;
    //  动态更新数据
    for(; updateIndex<maxTotal; updateIndex++)
    {
        let showRow = updateIndex<len ? data[updateIndex] : generateRow(updateIndex);
        $table.bootstrapTable('updateByUniqueId', {
            id : updateIndex
            , row : showRow
        });
    }
    //  插入数据
    for(;updateIndex<len; updateIndex++)
    {
        $table.bootstrapTable('insertRow', 
        {
            index : updateIndex
            , row : data[updateIndex]
        });
    }
    maxTotal = maxTotal >= len ? maxTotal : len;
}

问题截屏
CPU占用过高

CPU占用过高

最后的解决方法

在问题一的基础上,外面嵌套 一层div,在这层 div中增加css属性固定该div的高度,不用 bootstrapTable 的 data-height进行高度固定。

#table-wrapper {
    height : 400px;
    overflow : scroll;
} 

建议

问题结论,使用 load 直接刷新加载 数据不会费太多CPU资源;使用动态 update 表格 刷新数据会导致CPU占用过高。建议使用 bootstrapTable直接 load 数据刷新界面。

能够使用CSS解决的问题,尽量别用JS。过程中走了弯路,经验教训

测试文件

文件下载地址: 在此下载