vTable实现多维表格

介绍

vTable是字节开发的一款能用来渲染表格的库,是用canvas渲染,避免了传统用dom组件表格的一些问题,能很快的渲染出上万格子的表格。

接下来我将使用vTable构建类似下面的多维表格,其中quantity、sales等是指标。

使用

官网地址:Getting_Started------VisActor/VTable tutorial documents

1、首先下载npm,或者cdn引入vtable,并且准备一个div作为容器。vTable有ListTable(普通表格)和PivotTable(透视表)的区别,我们现在用PivotTable来构建表格。

html 复制代码
<script src="https://unpkg.com/@visactor/vtable/dist/vtable.min.js"></script>

<div id="tableContainer" style="width: 100vw;height:100vh;"></div>

<script>
 // 创建 VTable 实例
      const tableInstance = new VTable.PivotTable(document.getElementById('tableContainer'), option);
</script>

2、准备表格数据

html 复制代码
[
  {
    "city": "重庆",
    "exist": 1,
    "sold": 2,
    "column1": "家具"
  },
  {
    "city": "武汉",
    "column1": "家具",
    "exist": 7,
    "sold": 8
  },
  {
    "city": "重庆",
    "column1": "家具",
    "exist": 2,
    "sold": 3
  },
  {
    "city": "武汉",
    "column1": "家具",
    "exist": 8,
    "sold": 9
  },
  {
    "city": "重庆",
    "column1": "体育器材",
    "exist": 4,
    "sold": 5
  },
  {
    "city": "武汉",
    "column1": "体育器材",
    "exist": 10,
    "sold": 11
  },
  {
    "city": "重庆",
    "column1": "体育器材",
    "exist": 6,
    "sold": 7
  },

  {
    "city": "武汉",
    "column1": "体育器材",
    "exist": 11,
    "sold": 12
  }
]

3、构建option。

row和column用来指定行和列,

indicators用来指定指标,

dataConfig用来设置合计、平均值等一些计算,

hideIndicatorName用来设置是否隐藏指标

更多配置请看官网

javascript 复制代码
      const records = content
      const option = {
        records,
        rows: [
          {
            dimensionKey: 'city',
            title: '城市',
          }
        ],
        columns: [{
          dimensionKey: 'column1',
          title: '类别',
        }
        ],
        indicators: [{
          indicatorKey: 'exist',
          title: '现存'
        },
        {
          indicatorKey: 'sold',
          title: '已售',
        }
        ],
        // 设置左上角
        corner: {
          titleOnDimension: 'all',//row   column  all
        },
        // hideIndicatorName: true,//隐藏指标名
        // 设置合计
        dataConfig: {
          totals: {
            row: {
              showGrandTotals: true,
              subTotalsDimensions: ['exist'],
              grandTotalLabel: '合计',
            },
          }
        },
        widthMode: 'standard'
      };

完整代码

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <!-- <script src="https://unpkg.com/@visactor/vtable/dist/vtable.min.js"></script> -->
  <script src="./vtable.min.js"></script>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

  </style>
</head>

<body>
  <div id="tableContainer" style="width: 99vw;height:99vh;"></div>
  <script>
    fetch('./data4.txt').then(res => res.json()).then(res => {

      console.log(res);
      let content = res
      const records = content
      const option = {
        records,
        rows: [
          {
            dimensionKey: 'city',
            title: '城市',
          }
        ],
        columns: [{
          dimensionKey: 'column1',
          title: '类别',
        }
        ],
        indicators: [{
          indicatorKey: 'exist',
          title: '现存'
        },
        {
          indicatorKey: 'sold',
          title: '已售',
        }
        ],
        // 设置左上角
        corner: {
          titleOnDimension: 'all',//row   column  all
        },
        // hideIndicatorName: true,//隐藏指标名
        // 设置合计
        dataConfig: {
          totals: {
            row: {
              showGrandTotals: true,
              subTotalsDimensions: ['exist'],
              grandTotalLabel: '合计',
            },
          }
        },
        widthMode: 'standard'
      };
      // 创建 VTable 实例
      const tableInstance = new VTable.PivotTable(document.getElementById('tableContainer'), option);

    })

  </script>
</body>

</html>

效果

现存和已售是指标。

最后附上效果:

END

相关推荐
程序猿小D15 分钟前
第14节 Node.js 全局对象
linux·前端·npm·node.js·编辑器·vim
Mintopia20 分钟前
当代码遇见光影魔术师:用 JavaScript 揭秘环境光遮蔽的奇幻世界
前端·javascript·计算机图形学
Dignity_呱37 分钟前
别在傻傻分不清any void never unknown的场景啦
前端·vue.js·typescript
站在风口的猪110839 分钟前
《前端面试题:CSS3新特性》
前端·css·html·css3·html5
crary,记忆1 小时前
Angular报错:cann‘t bind to ngClass since it is‘t a known property of div
前端·javascript·angular·angular.js
betterangela1 小时前
react私有样式处理
前端·react.js·前端框架
几何心凉1 小时前
如何处理React中表单的双向数据绑定?
前端·javascript·react.js
巴巴_羊1 小时前
React 新项目
前端·react.js·前端框架
入行IT两年半1 小时前
element-plus 单选组件 el-radio,选不上,又没报错,直接复制官网也不行解决方案
前端·vue.js·elementui
Bl_a_ck2 小时前
【JS进阶】ES5 实现继承的几种方式
开发语言·前端·javascript