Gahing's blog Gahing's blog
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Gahing / francecil

To be best
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前端基础

  • 应用框架

  • 工程能力

  • 应用基础

  • 专业领域

    • 服务端

    • 跨端技术

    • Web IDE

    • 中后台

    • 动效渲染

    • 可视化

      • 业务场景

        • D2C

        • 搭建

          • web通用撤销重做技术
          • 前端可视化之伸缩拖动旋转
          • 大屏可视化之组件层级设置
            • 前言
            • datav
            • 有数
            • 参考
          • 思维导图组件开发
      • 图像处理

      • 图表

    • 埋点监控

    • 多媒体

    • 桌面技术

    • 游戏互动

    • 编辑器

    • 虚拟化与容器化

    • 设计系统

  • 业务场景

  • 大前端
  • 专业领域
  • 可视化
  • 业务场景
  • 搭建
gahing
2019/07/02
目录

大屏可视化之组件层级设置

# 前言

最近在进行大屏可视化产品的技术调研,主要是调研 网易有数 和 datav

在组件层级排列这块,两者的实现是不一样的

  • datav:组件均在同级(z-index都是一样的),后定义的属于高层。调整层级就需要移动dom节点位置
  • 有数:根据z-index去设置,调整层级就需要调整自身z-index以及其他受影响的图表 z-index

通过分析vue上两者的实现,比较两者的优缺点

# datav

Dashbox 是层级控件

<template>
  <Dashbox
    v-for="dashbox in dashboxs"
    :key="dashbox.id"
    :dashbox="dashbox"
  ></Dashbox>
</template>
<script>
  data(){
    return {
      dashboxs:[{...},{...}]
    }
  }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

当调整层级时,我们调用方法

move:(type,id)=>{
  let index = this.dashboxs.findIndex(dashbox=>dashbox.id===id)
  switch(type){
    //上移一层
    case 'up':{
      let dashbox = this.dashboxs.splice(index,1)
      this.dashboxs.splice(index+1,0,dashbox[0])
      break;
    }
    //下移一层
    case 'down':{
      let dashbox = this.dashboxs.splice(index,1)
      this.dashboxs.splice(index - 1 >= 0 ? index - 1 : 0, 0,dashbox[0])
      break;
    }
    //置顶
    case 'top':{
      let dashbox = this.dashboxs.splice(index,1)
      this.dashboxs.push(dashbox)
      break;
    }
    //置底
    case 'bottom':{
      let dashbox = this.dashboxs.splice(index,1)
      this.dashboxs.unshift(dashbox)
      break;
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

每个 dashbox 有key值,根据 diff 算法同级组件之间更改位置还是很高效的

优点:

  1. 层级调整方法实现简单
  2. dashbox 数据不用带z-index参数,节省空间

缺点:

  1. dom 节点移动会产生Layout,不过这里用的绝对定位,所以影响很小,测试Layout耗时在1ms左右(Performance中无红色提示)

# 有数

Dashbox 是层级控件 组件的 zIndex 值从1开始,不断递增且不中断

<template>
  <Dashbox
    v-for="dashbox in dashboxs"
    :key="dashbox.id"
    :dashbox="dashbox"
    style="z-index:`${dashbox.zIndex}`"
  ></Dashbox>
</template>
<script>
  data(){
    return {
      dashboxs:[{...},{...}]
    }
  }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

当调整层级时,我们调用方法

move:(type,id)=>{
  let dashbox = this.dashboxs.find(dashbox=>dashbox.id===id)
  let maxz = this.dashboxs.length
  let curz = dashbox.zIndex
  switch(type){
    //上移一层
    case 'up':{
      if(curz<maxz){
        this.dashboxs.find(d=>d.zIndex===curz+1).zIndex = curz
        dashbox.zIndex = curz +1
      }
      break;
    }
    //下移一层
    case 'down':{
      if(curz>1){
        this.dashboxs.find(d=>d.zIndex===curz-1).zIndex = curz
        dashbox.zIndex = curz - 1
      }
      break;
    }
    //置顶
    case 'top':{
      if(curz!==maxz){
        this.dashboxs.forEach(v=>v.zIndex>curz&&v.zIndex=v.zIndex-1)
        dashbox.zIndex = maxz
      }
      break;
    }
    //置底
    case 'bottom':{
      if(curz!==0){
        this.dashboxs.forEach(v=>v.zIndex<curz&&v.zIndex=v.zIndex+1)
        dashbox.zIndex = 0
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

优点:

  1. 利用z-index仅重绘,不产生回流

缺点:

  1. 层级调整方法相对复杂
  2. 组件过多时z-index不可控,可能影响其他同层级非dashbox组件的层级显示(比如同层级有一个划框,其z-index就绝对要在最高层)
  3. 数据增加z-index字段,略微增加了空间

# 参考

  1. 不同渲染引擎在不同样式变动下的Layout/Paint/Composite(渲染层合并)情况 (opens new window)
编辑 (opens new window)
#大屏
上次更新: 2025/06/11, 23:06:59
前端可视化之伸缩拖动旋转
思维导图组件开发

← 前端可视化之伸缩拖动旋转 思维导图组件开发→

最近更新
01
我的 2024 总结
12-31
02
浅谈代码质量与量化指标
08-27
03
快速理解 JS 装饰器
08-26
更多文章>
Theme by Vdoing | Copyright © 2016-2025 Gahing | 闽ICP备19024221号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式