<!--
 * @Author: zk
 * @Date: 2021-09-16 16:24:53
 * @LastEditTime: 2021-11-02 15:45:25
 * @LastEditors: Please set LastEditors
 * @Description: 柱状图
 * @FilePath: \vue-admin-template-master\src\layout\components\Echarts\commonChartsBar.vue
-->
<template>
  <div class="ChartsBar" :id="id"></div>
</template>

<script>
// 柱状图初始数据
import ChartsBar from '../../mixin/commonChartsBar'
export default {
  name: 'ChartsBar',
  props: {
    // 柱状图生成所需id
    id: {
      type: String,
      default: ''
    },
    // 柱状图额外的数据
    option: {
      type: Object,
      default: () => { }
    }
  },
  mixins: [ChartsBar],
  data () {
    return {
      myChart: null, //柱状图实例
      desc: 300 // 防抖时间
    }
  },
  mounted () {
    // 生成图形
    this.initEcharts()
    // 监听页面缩放 防止dom重复渲染
    window.addEventListener('resize', _.debounce(this.handle, this.desc))
  },
  beforeDestroy () {
    // 销毁实例和移除监听
    if (this.myChart) {
      this.myChart.dispose()
      window.removeEventListener('resize', this.handle)
      this.myChart = null
    }
  },
  watch: {
    // 监听数据变化 重绘图形
    option: {
      handler (obj) {
        // 初始数据和额外的配置数据耦合
        const objData = _.merge(this.options, obj)
        // 生成柱状图
        this.myChart.setOption(objData)
      },
      deep: true
    }
  },
  methods: {
    /**
     * @description: 图形缩放
     * @param {*}
     * @return {*}
     */
    handle () {
      if (this.myChart) {
        this.myChart.resize()
      }
    },
    /**
     * @description: 初始化echarts
     * @param {*}
     * @return {*}
     */
    initEcharts () {
      // 初始数据和额外的配置数据耦合
      const objData = _.merge(this.options, this.option)
      // dom
      const chartDom = document.getElementById(this.id)
      // 初始化
      this.myChart = this.$echarts.init(chartDom)
      // 生成柱状图
      this.myChart.setOption(objData)
      // 事件
      this.myChart.on('click', params => {
        this.$emit('getChartData', params)
      })
    }
  }
}
</script>

<style lang="scss" scoped>
.ChartsBar {
  height: 100%;
  width: 100%;
  position: absolute;
  left: 0;
  top: 0;
}
</style>