echarts组件进一步封装

1.echartAll

<template>
  <div
      class="echart"
      :id="classname"
      :class="classname"
      @click="echartclick"
  ></div>
</template>

<script>
import * as echarts from "echarts";
import "echarts-wordcloud";
import EleResize from "./js/esresize";

export default {
  props: {
    option: {
      type: Object,
    },
  },
  data() {
    return {
      defineOption: {
        legend: [
          {
            icon: "circle",
            textStyle: {
              color: "#fff",
            },
          },
        ],
        tooltip: {
          show: true,
          backgroundColor: "rgba(0,0,0,.51)",
          borderWidth: 0,
          padding: 20,
        },
        xAxis: [
          {
            type: "category",
            axisLine: {
              show: false,
            },
            axisTick: {
              show: false,
            },
            axisLabel: {
              color: "#F0F0F0",
            },
            splitLine: {
              lineStyle: {
                color: "rgba(238,238,238, .1)",
              },
            },
            boundaryGap: true,
          },
        ],
        yAxis: [
          {
            type: "value",
            axisLine: {
              show: false,
            },
            axisTick: {
              show: false,
            },
            axisLabel: {
              color: "#F0F0F0",
            },
            nameTextStyle: {
              color: "#F0F0F0",
            },
            splitLine: {
              lineStyle: {
                color: "rgba(238,238,238, .1)",
              },
            },
            splitNumber: 3,
          },
          {
            type: "value",
            axisLine: {
              show: false,
            },
            axisTick: {
              show: false,
            },
            axisLabel: {
              color: "#F0F0F0",
            },
            splitLine: {
              show: false,
            },
            nameTextStyle: {
              color: "#F0F0F0",
            },
            splitNumber: 3,
          },
        ],
        grid: [
          {
            top: 0,
            left: 0,
            right: 0,
            bottom: 0,
            containLabel: true,
          },
        ],
      },
      classname: `echart${this.randomNum(1, 99999999999)}`,
      chart: null,
      optionResetList: [
        "title",
        "legend",
        "grid",
        "xAxis",
        "yAxis",
        "dataZoom",
        "visualMap",
        "series",
      ],
    };
  },
  watch: {
    option: {
      deep: true,
      handler(val) {
        this.setOption(val);
      },
    },
  },
  methods: {
    //初始化函数,用于第一次进入组件时的初始化操作
    initialize() {
      this.chart = echarts.init(
          document.getElementsByClassName(this.classname)[0]
      );
      let resizeDiv = document.getElementById(this.classname);
      EleResize.on(resizeDiv, () => {
        this.chart.resize();
      });
      this.setOption(this.option);
    },
    //渲染函数
    setOption(data) {
      let target = this.Deepcloned(this.defineOption, data);
      if(!this.chart){
        this.chart = echarts.init(
          document.getElementsByClassName(this.classname)[0]
      );
      }
      this.chart.clear();
     setTimeout(()=>{
        this.chart.setOption(target);
     },100)
    },
    // 该函数用于执行合并操作
    Deepcloned(prevdata, nextdata) {
      return this.dealwith(
          this.dealwith({}, this.loned(prevdata)),
          this.pretreatment(nextdata)
      );
    },
    //合并函数,用于合并默认配置对象与外部配置对象
    dealwith(Olddata, Newdata) {
      let onetype = this.type(Olddata), onetypes = this.type(Newdata)
      //获取两个数据的类型
      //如果相等且为对象或数组,进行递归,否则不是同一类型,完全以外部为准,赋值一个深拷贝的外部对象
      //考虑到如果外部没有改变默认配置的时候,需要以外部对象为准进行for in循环
      //如果不是对象或者数组,则可以直接进行赋值
      if (onetype === onetypes) {
        if (onetype === 'array'||onetype === 'object') {
          for (let key in Newdata) {
            Olddata[key] = this.dealwith(Olddata[key], Newdata[key])
          }
        }else{
          Olddata = Newdata
        }
      }else{
        Olddata = this.loned(Newdata)
      }
      return Olddata;
    },
    // 配置对象初始化函数,为保持数据格式统一
    pretreatment(option) {
      let obj = this.loned(option);
      for (let key in option) {
        if (this.optionReset(key)) {
          if (Array.isArray(option[key])) {
          } else {
            obj[key] = [obj[key]];
          }
        }
      }
      return obj;
    },
    // 重置配置对象判断函数
    optionReset(type) {
      return this.optionResetList.some((es) => es === type);
    },
    //对象类型判断函数,自定义类型判断
    type(type) {
      if (
          typeof type == "string" ||
          typeof type == "number" ||
          typeof type == "boolean" ||
          typeof type == "undefined" ||
          typeof type == "function"
      ) {
        return 'notobject'
      } else if (typeof type == "object") {
        if (Array.isArray(type)) {
          return 'array'
        } else {
          return 'object'
        }
      }

    },
    //深克隆函数
    loned(obj) {
      if (
          typeof obj == "string" ||
          typeof obj == "number" ||
          typeof obj == "boolean" ||
          typeof obj == "undefined" ||
          typeof obj == "function"
      ) {
        return obj;
      }
      let arr = "";
      if (Array.isArray(obj)) {
        arr = [];
        arr = obj.map((item) => {
          return this.loned(item);
        });
      } else if (typeof obj == "object") {
        arr = {};
        for (let key in obj) {
          arr[key] = this.loned(obj[key]);
        }
      }
      return arr;
    },
    //随机数生成函数,用于创建随机类名
    randomNum(minNum, maxNum) {
      switch (arguments.length) {
        case 1:
          return parseInt(Math.random() * minNum + 1, 10);
        case 2:
          return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
        default:
          return 0;
      }
    },
    //点击事件,用于抛出点击事件
    echartclick(e) {
      this.$emit("onClick", e);
    },

  },
  mounted() {
    this.initialize();
  },
};
</script>

<style>
.echart {
  width: 100%;
  height: 100%;
}
</style>

2.EleResize

var EleResize = {
    _handleResize: function (e) {
        var ele = e.target || e.srcElement
        var trigger = ele.__resizeTrigger__
        if (trigger) {
            var handlers = trigger.__z_resizeListeners
            if (handlers) {
                var size = handlers.length
                for (var i = 0; i < size; i++) {
                var h = handlers[i]
                var handler = h.handler
                var context = h.context
                handler.apply(context, [e])
                }
            }
        }
    },
    _removeHandler: function (ele, handler, context) {
        var handlers = ele.__z_resizeListeners
        if (handlers) {
            var size = handlers.length
            for (var i = 0; i < size; i++) {
                var h = handlers[i]
                if (h.handler === handler && h.context === context) {
                handlers.splice(i, 1)
                return
                }
            }
        }
    },
    _createResizeTrigger: function (ele) {
        var obj = document.createElement('object')
        obj.setAttribute('style',
        'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;')
        obj.onload = EleResize._handleObjectLoad
        obj.type = 'text/html'
        ele.appendChild(obj)
        obj.data = 'about:blank'
        return obj
    },
    _handleObjectLoad: function (evt) {
        this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__
        this.contentDocument.defaultView.addEventListener('resize', EleResize._handleResize)
    }
}
if (document.attachEvent) { // ie9-10
    EleResize.on = function (ele, handler, context) {
        var handlers = ele.__z_resizeListeners
        if (!handlers) {
        handlers = []
        ele.__z_resizeListeners = handlers
        ele.__resizeTrigger__ = ele
        ele.attachEvent('onresize', EleResize._handleResize)
        }
        handlers.push({
        handler: handler,
        context: context
        })
    }
    EleResize.off = function (ele, handler, context) {
        var handlers = ele.__z_resizeListeners
        if (handlers) {
            EleResize._removeHandler(ele, handler, context)
            if (handlers.length === 0) {
                ele.detachEvent('onresize', EleResize._handleResize)
                delete ele.__z_resizeListeners
            }
        }
    }
} else {
    EleResize.on = function (ele, handler, context) {
        var handlers = ele.__z_resizeListeners
        if (!handlers) {
            handlers = []
            ele.__z_resizeListeners = handlers

            if (getComputedStyle(ele, null).position === 'static') {
                ele.style.position = 'relative'
            }
            var obj = EleResize._createResizeTrigger(ele)
            ele.__resizeTrigger__ = obj
            obj.__resizeElement__ = ele
        }
        handlers.push({
            handler: handler,
            context: context
        })
    }
    EleResize.off = function (ele, handler, context) {
        var handlers = ele.__z_resizeListeners
        if (handlers) {
            EleResize._removeHandler(ele, handler, context)
            if (handlers.length === 0) {
                var trigger = ele.__resizeTrigger__
                if (trigger) {
                    trigger.contentDocument.defaultView.removeEventListener('resize', EleResize._handleResize)
                    ele.removeChild(trigger)
                    delete ele.__resizeTrigger__
                }
                delete ele.__z_resizeListeners
            }
        }
    }
}
export default EleResize
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容