跳到主要内容

自定义echarts控件

自定义控件文档中js文件规范

js文件是组件的主入口文件,该文件提供了一个示例供您参考,并介绍了js文件中常用的组件生命周期或相关函数。

函数说明
definition()控件初始化时需要的属性(下面有详细介绍)
init()默认初始化方法
render()默认渲染方法,当组件初始化和重绘时被调用。(自定义实现)
resize()缩放,当组件被拖拽、缩放时被调用。
_transData()缩放,当组件被拖拽、缩放时被调用。

js文件示例如下:

let jsonConfig = {
  "chartConfig": [
    {
      "title": "位置",
      "key": "center",
      "children": [
        {
          "title": "水平位置",
          "key": "centerX",
          "widget": 6,
          "max": 100,
          "min": 0,
          "default": 50,
          "styleUnit": "%"
        },
        {
          "title": "垂直位置",
          "key": "centerY",
          "widget": 6,
          "max": 100,
          "min": 0,
          "default": 60,
          "styleUnit": "%"
        }
      ]
    },

    {
      "title": "图形样式",
      "key": "custom",
      "children": [
        {
          "title": "外径",
          "key": "radiusOut",
          "widget": 6,
          "max": 100,
          "min": 0,
          "default": 55,
          "styleUnit": "%"
        },
        {
          "title": "内径",
          "key": "radiusIn",
          "widget": 6,
          "max": 100,
          "min": 0,
          "default": 0,
          "styleUnit": "%"
        },
        {
          "title": "圆角",
          "key": "itemStyle__normal__borderRadius",
          "widget": 6,
          "max": 20,
          "min": 0,
          "default": 5
        },
        {
          "title": "边框大小",
          "key": "itemStyle__normal__borderWidth",
          "widget": 6,
          "max": 20,
          "min": 0,
          "default": 2
        },
        {
          "title": "边框颜色",
          "key": "itemStyle__normal__borderColor",
          "widget": 5,
          "default": "#fff"
        }
      ]
    }
  ],
  "dataConfig": {
    "indexs": [
      {
        "name": "展示",
        "sort": 0,
        "format": null,
        "type": 3
      }
    ],
    "columns": [
      {
        "name": "度量一",
        "sort": 0,
        "aggregate": 1,
        "format": null,
        "type": 2
      }
    ],
    "data": [
      {
        "展示": "展示一",
        "度量一": 78
      },
      {
        "展示": "展示二",
        "度量一": 100
      },
      {
        "展示": "展示三",
        "度量一": 100
      },
      {
        "展示": "展示四",
        "度量一": 40
      },
      {
        "展示": "展示五",
        "度量一": 70
      },
      {
        "展示": "展示六",
        "度量一": 105
      }
    ]
  }
}
// defaultOption   echarts默认配置项
let defaultOption = {
  "series": [
    {
      "name": '基础饼图',
      "type": 'pie',
      "radius": ['0%', '55%'],
      "center": ['50%', '60%'],
      "itemStyle": {
        "normal": {
          "label": {
            "show": true,
            "color": 'rgba(0, 0, 0, 1)',
          },
          "labelLine": {
            "length": 3,
            "show": true,
          },
          "borderRadius": 0,
          "borderWidth": 0,
          "borderColor": '#fff',
        },
      },
      "data": [
        {
          "value": 400,
          "name": '展示一',
        },
        {
          "value": 335,
          "name": '展示二',
        },
        {
          "value": 310,
          "name": '展示三',
        },
        {
          "value": 234,
          "name": '展示四',
        },
        {
          "value": 135,
          "name": '展示五',
        },
      ],
      "type": 'pie',
      "radius": '50%',
      "label": {
        "normal": {
          "fontSize": 12,
        },
      },
      "emphasis": {
        "itemStyle": {
          "shadowBlur": 10,
          "shadowOffsetX": 0,
          "shadowColor": 'rgba(0, 0, 0, 0.5)',
        },
      },
    },
  ],
  "tooltip": {
    "show": true,
    "trigger": 'item',
  },
  "legend": {
    "show": true,
    "orient": 'vertical',
    "left": 'left',
  },
  "label": {
    "show": true,
    "position": 'outside',
    "color": '#409EFF',
  },
  "color": ['#538FE2', '#89E5F9', '#9DC6FF'],
};
/**
 * 创建的所有控件的实例都必须继承 XZChart基类
 */
class custom_pie extends XZChart {
  constructor(selectors, config) {
    super(selectors, config);
  }
  /**
   * 图形定义  此方法为必填方法  定义控件的基本属性
   *   定义类型为饼图
   *   默认的json配置为 jsonConfig  PS:请注意拷贝 否则会修改到全局 因为你可能多次用到这个实例对象
   *   需要的维度数量为1
   *   需要的度量数量为1
   */
  definition() {
    this.definitions.type = 'custom_pie';
    this.definitions.jsonConfig = jsonConfig; // 使用时深度拷贝下。
    this.definitions.defaultOption = defaultOption;
    this.definitions.indexCount = 1;
    this.definitions.columnCount = 1;
  }
  /**
   * 控件初始化方法 会在控件初始化的时候执行一次  注意:只会执行一次!!请确保在正确的地方使用它
   * 该过程中我们 需要初始化echarts实例
   */
  init() {
    this.chart = echarts.init(this.controlEl.el);
    this.chart.on('click', (params) => {});
    this.render();
  }

  /**
   * 控件获取数据的方法(核心)
   * 请注意我们的数据和配置项是分开的 都被定义在json文件里面  也就是我们一开始引入的 jsonConfig  最后挂在到 this.option上
   * 格式如下:
   * option:{ dataConfig: {indexs: [],columns: [],data: []}}
   * 我们echarts最后的配置项会被设在到 this.chartOptions上    请确保最后设置的chart.setOption的内容是这个对象
   * 我们在获取数据的时候,会根据我们配置项的dataConfig.indexs 以及 dataConfig.columns 来获取我们想要的数据
   *
   *
   * */
  _transData() {
    const {
      option: { dataConfig },
      dataHandler,
      chartOptions,
    } = this;
    /**
     * dataHandler是数据处理的核心地方 我们不关心如何实现 只关系如何取值
     * 下例解释 getDataByColumn 的获取值的方法
     */
    /** 获取控件数据配置的最后一个维度 (本例中为 "展示" )*/
    let findexs = dataHandler.renderIndexs.at(-1);
    const { columns } = dataConfig;
    if (findexs && columns.length) {
      /** 获取控件数据配置的第一个度量 */
      /*
      本例中为 { "name": "度量一","aggregate": 1, "type": 2}
      其中 aggregate 为根据维度进行聚合的聚合方式
      */
      const { name, aggregate } = columns[0];
      /**
       * getDataByColumn 为 dataHandler 获取指定维度或者度量的数据, 只需要把对应的name传入就可以得到(如果是度量需要第二个参数需要传入聚合方式)
       * 下例中得到数据为 columsZeroData  -- [78, 100, 100, 40, 70, 105]
       *                nameArr -- ['展示一', '展示二', '展示三', '展示四', '展示五', '展示六']
       */
      const columsZeroData = dataHandler.getDataByColumn(name, aggregate);
      const nameArr = dataHandler.getDataByColumn(findexs.name);

      /**
       * 对饼图需要的数据进行整理  具体控件请查询ecahrts官网
       * 格式为 [{name: '展示一', value: 1}]
       */
      const data = nameArr.map((name, index) => ({
        name,
        value: columsZeroData[index],
      }));

      /**
       * 对最后需要chart.setOption的对象进行赋值
       */
      chartOptions.series[0].data = data;
      chartOptions.series[0].name = name;
    }
  }
  /**
   *
   * 控件处理配置项的核心方法
   * @param {使我们json里面配置的chartConfig} chartConfig
   * 如果不是第一次设置配置,那么chartConfig会和this.chartConfig进行合并 创建出新的chartConfig
   * 合并字段为
   * chartConfig   json里面的配置项
   * defaultOption   echarts默认配置项
   * this.chartConfig  每次设置的最新的配置项
   */
  _transOption(chartConfig) {
    const { custom, center } = chartConfig;
    /**
     * 获取到饼图的第一个系列  关于系列的详细知识请查询echarts文档
     */
    const optionZero = this.chartOptions.series[0];

    /**
     *  设置饼图的半径和样式 (非必须  根据你想要的效果去处理)
     */
    if (custom) {
      optionZero.radius = [custom.radiusIn, custom.radiusOut];
    }

    if (center) {
      optionZero.center = [center.centerX, center.centerY];
    }
    /**
     * ........ 下面可以 自定义设置你想要设置的配置项
     * 这样一个饼图就处理好了!!!
     */
  }
  /**
   * 控件缩放时候需要执行的方法  可选
   * 这里我们进行了对echarts的resize方法进行了调用  确保缩放后能重新渲染
   */
  resize() {
    this.chart && this.chart.resize();
  }
  /**
   * 控件渲染方法  会在控件初始化、改变配置或者数据的时候调用
   * 渲染控件时请确保控件已经初始化完毕  对于echarts控件  请确保echarts控件已经在init方法中 执行过echarts.init
   */
  render() {
    if (this.chart) {
      this.chart.setOption(this.chartOptions);
    }
  }
}
/**
 * 图形默认配置  这里的属性会和 this.chartOptions 的属性进行合并
 * 详情配置请查询echarts官网
 */
window.custom_pie = custom_pie;