Skip to content

Latest commit

 

History

History
executable file
·
99 lines (65 loc) · 5 KB

架构介绍.md

File metadata and controls

executable file
·
99 lines (65 loc) · 5 KB

KityCharts 介绍

定位

KityCharts 提供构建数据可视化产品的机制和工具,不提供具体数据可视化的产品。源码里的 charts 目录是一些示例和参考。

基本思路

KityCharts 主要包括三个部分的内容:组件(Component)、工具(Utility)、数据(Data)

要使用 KityCharts 构建一个数据可视化的图表,需要关心:

  1. 我的数据都是什么格式
  2. 我需要用什么组件来呈现我的数据
  3. 我如何把我的数据变成组件需要的参数

一个数据可视化产品的更新流程是这样的:

  1. 数据发生变化(Data.update())
  2. Chart 的 update 方法被触发(Chart.update()
    • 获取最新的数据
    • 格式化数据
    • 利用数据更新包含的组件

数据格式化

对于很多时候,前后端的数据格式可能不是一致的。需要明确概念:后端返回的数据叫做原始数据,而直接驱动数据可视化产品的数据叫做标准数据

原始数据标准数据的转换过程称为数据格式化。从原始数据到标准数据的转换,可能会涉及到数据的拆分、聚合、分组等操作。

建议每个数据可视化产品都定义一种标准数据,因为这样以后想要适应不同的原始数据的时候,只需要重新定义数据格式化的过程即可。

数据格式化通过继承 Data 类实现,只需要复写 format 方法即可。

更新组件

对于每一个组件,都有其参数,比如高度、颜色、角度、文本等。图表应该把标准数据分发映射到组件的参数里,然后调用其 update 方法。KityCharts 内置了一些简单的组件,比如 Label、Tooltip、Categories、Line、Mesh 等。

提供的组件不一定能满足所有数据可视化产品的需求,很多时候需要拓展原有组件或者开发新的组件。KityCharts 组件有一套约定的更新机制,开发组件应该遵循这套机制。

  1. 确定组件的参数,组件的外观全部由这套参数来控制,比如 color、height、size 等。

  2. 确定更新规则,更新规则通过实现 registerUpdateRules 方法来实现,并且注意和父类的规则合并:

    registerUpdateRules: function() {
        return kity.Utils.extend(this.callBase(), {
            updateSize: [ 'size' ],
            updateStyle: [ 'color', 'font' ]
        });
    },
    
    updateSize: function( size ) {
    
    },
    
    updateFont: function( color, font ) {
    
    }
  3. 调用组件的 update( param ) 方法时,会是以下的过程:

    • param 参数作为更新参数列表,如果为空,以当前组件参数(this.param)为更新参数列表
    • 如果是首次更新,会把现有的参数加到更新参数列表中,并且获取更新规则(调用 registerUpdateRules())
    • 对于每一条更新规则,使用规则去更新参数:
      • 规则中的参数有至少一个被包含在如果更新参数列表中,继续下一步,否则结束更新
      • 使用规则中的方法名,得到更新方法,并且把参数列表中的参数按规则指定的顺序传到更新方法中更新。如果更新参数列表中缺少规则中需要的参数,则从给出组件当前参数对应的值
      • 对于更新参数中未匹配更新规则的参数,会去查找组件中是否有键值和参数名称同名的子组件,如果有,用该参数更新子组件

这套更新机制解决了以下问题:

  1. 强制拆分组件的更新方法,比较好维护
  2. 让组件可以局部更新,而且不需要关心什么时候更新哪个局部
  3. 自动判断是否无效更新,如果参数没有变,不调用更新方法

支持动画的组件

对于一些组件,如果有支持动画的参数,可以从 AnimatedChartElement 继承,就能自动拥有动画接口。你需要实现 getAnimatedParam() 接口,告诉 AnimatedChartElement 那些参数是可以被用于做动画的。

getAnimatedParam: function() {
    // 默认 x, y 属性是支持动画的,这两个参数无需再告知。
    return ['height', 'percent'];    
}

从 AnimatedChartElement 继承的组件,使用 animate 方法可以使用动画去更新参数。不支持动画的参数也可以用这个方法去更新,会自动改用 update 方法来更新。

组件群

数据可视化产品很多情况下会处理数据序列,这些序列会增长、减少,以及序列中的元素也会发生变化。ElementList 是专门为这种需求设计的。 它也是一个 ChartElement,有三个参数:elementClasslistcommon

  • elementClass: 指定序列中的每个元素应该用哪一个组件来渲染
  • list: 组件的参数列表
  • common: 组件的公共参数

当 list 发生更新的时候,会自动增加或减少组件来适应 list 的长度,然后对于每一个组件,用 list 中的参数来一一更新。如果 elementClass 是支持动画的组件类,则会使用动画来更新。

内置的 Categories、Mesh 都使用到了 ElementClass。