链式调用工具类和封装思路

链式调用的封装中,为每个方法都添加 JDoc注释可方便IDE提供调用提示

class 方式封装

/**
 * ECharts 配置类,用于链式配置图表选项
 */
class EChartsConfig {
  constructor() {
    this.option = {};
  }

  /**
   * 设置图表标题
   * @param {string} text - 主标题文本
   * @param {string} [subtext=''] - 副标题文本
   * @returns {EChartsConfig} 返回当前实例用于链式调用
   */
  title(text, subtext = '') {
    this.option.title = {
      text,
      subtext
    };
    return this;
  }

  /**
   * 设置图例配置
   * @param {Array} [data=[]] - 图例数据数组
   * @param {string} [position='top'] - 图例位置('top'|'bottom'|'left'|'right')
   * @returns {EChartsConfig} 返回当前实例用于链式调用
   */
  legend(data = [], position = 'top') {
    this.option.legend = {
      data,
      position
    };
    return this;
  }

  /**
   * 设置提示框配置
   * @param {string} [trigger='item'] - 触发类型('item'|'axis'|'none')
   * @param {string|Function} [formatter=null] - 提示框内容格式化器
   * @returns {EChartsConfig} 返回当前实例用于链式调用
   */
  tooltip(trigger = 'item', formatter = null) {
    this.option.tooltip = {
      trigger,
      formatter
    };
    return this;
  }

  /**
   * 设置X轴配置
   * @param {string} [type='category'] - 坐标轴类型('value'|'category'|'time'|'log')
   * @param {Array} [data=[]] - 坐标轴数据
   * @param {string} [name=''] - 坐标轴名称
   * @returns {EChartsConfig} 返回当前实例用于链式调用
   */
  xAxis(type = 'category', data = [], name = '') {
    this.option.xAxis = {
      type,
      data,
      name
    };
    return this;
  }

  /**
   * 设置Y轴配置
   * @param {string} [type='value'] - 坐标轴类型('value'|'category'|'time'|'log')
   * @param {string} [name=''] - 坐标轴名称
   * @returns {EChartsConfig} 返回当前实例用于链式调用
   */
  yAxis(type = 'value', name = '') {
    this.option.yAxis = {
      type,
      name
    };
    return this;
  }

  /**
   * 添加系列配置
   * @param {string} name - 系列名称
   * @param {string} [type='line'] - 图表类型('line'|'bar'|'pie'|'scatter'等)
   * @param {Array} [data=[]] - 系列数据
   * @param {Object} [options={}] - 系列额外配置项
   * @returns {EChartsConfig} 返回当前实例用于链式调用
   */
  series(name, type = 'line', data = [], options = {}) {
    if (!this.option.series) {
      this.option.series = [];
    }
    
    this.option.series.push({
      name,
      type,
      data,
      ...options
    });
    
    return this;
  }

  /**
   * 合并自定义配置
   * @param {Object} config - 自定义配置对象
   * @returns {EChartsConfig} 返回当前实例用于链式调用
   */
  custom(config) {
    this.option = {
      ...this.option,
      ...config
    };
    return this;
  }

  /**
   * 获取最终配置对象
   * @returns {Object} 返回配置好的option对象
   */
  get() {
    return this.option;
  }
}

export default EChartsConfig

function 方式封装

/**
 * @typedef {{
 *   value: Object,
 *   title: function(Object): PieOption,
 *   tooltip: function(Object): PieOption,
 *   xAxis: function(Object): PieOption,
 *   yAxis: function(Object): PieOption,
 *   series: function({name?: string, type?: string, data?: Array, options?: Object}): PieOption
 * }} PieOption
 */

/**
 * ECharts 饼图配置生成器
 * @returns {PieOption}
 */
function PieGenerator() {
  /** @type {PieOption} */
  const option = {
    value: {},

    /**
     * 设置标题配置
     * @param {Object} option 标题配置项
     * @returns {PieOption} this
     */
    title(option) {
      this.value.title = { ...option };
      return this;
    },
    /**
     * 设置提示框配置
     * @param {Object} option 提示框配置项
     * @returns {PieOption} this
     */
    tooltip(option) {
      this.value.tooltip = { ...option };
      return this;
    },
    /**
     * 设置x轴配置
     * @param {Object} option x轴配置项
     * @returns {PieOption} this
     */
    xAxis(option) {
      this.value.xAxis = { ...option };
      return this;
    },
    /**
     * 设置y轴配置
     * @param {Object} option y轴配置项
     * @returns {PieOption} this
     */
    yAxis(option) {
      this.value.yAxis = { ...option };
      return this;
    },
    /**
     * 设置系列配置
     * @param {Object} params 系列配置参数
     * @param {string} [params.name] 系列名称
     * @param {string} [params.type="line"] 系列类型
     * @param {Array} [params.data=[]] 系列数据
     * @param {Object} [params.options={}] 其他配置项
     * @returns {PieOption} this
     */
    series({ name, type = "line", data = [], options = {} } = {}) {
      this.value.series = [];
      this.value.series.push({
        name,
        type,
        data,
        ...options,
      });
      return this;
    },
    /**
     * 其他配置
     * @param {Object} option
     * @returns
     */
    custom(option) {
      this.value = {
        ...this.value,
        ...option,
      };
      return this;
    },
    /**
     * 获取配置好的 option
     * @returns 返回最终配置 option
     */
    get() {
      return this.value;
    },
  };

  return option;
}

export default PieGenerator;


链式调用工具类和封装思路
https://halo.jiangling.site/archives/chain-util
作者
你的降灵
发布于
2025年08月13日
许可协议