Echarts:图表作为子组件监听父组件窗口的大小

本文介绍了如何在Vue应用中,通过监听窗口大小变化实现父组件页面拖动时,ECharts图表在子组件中跟随调整大小。主要涉及了窗口事件监听、ECharts图表初始化和resize方法的调用,以及如何在子组件中设置图表宽高百分比以保持响应式布局。
摘要由CSDN通过智能技术生成

实现效果:当父组件页面拖动时,echarts图表监听窗口大小 变化,在子组件中跟随父组件大小变化。

首先用Watch监听窗口大小的变化

  @Watch("visible")
  onVisibleChange(v: boolean) {
    console.log(v);
    this.resize();
  }

 绘制echarts图表函数

  drawChartBar(): void {
    const chart: PdCAny | null = this.$refs["bar"];
    // 基于准备好的dom,初始化echarts实例
    this.myChart = echarts.init(chart);
    // 指定图表的配置项和数据
    const option: PdCObject = {
      grid: {
        top: 20,
        left: 57,
        right: 24,
        bottom: 20,
        width: "auto",
        height: "auto",
        formatter: "{c}",
      },
      xAxis: {
        type: "category",
        data: this.dataX,
        //直角坐标系内绘图网格

        //坐标轴名称的样式
        axisLabel: {
          color: "rgba(192,196,206",
          fontSize: 12,
          fontFamily: "Microsoft YaHei UI",
          fontWeight: "400",
        },
        // 轴线样式
        axisLine: {
          lineStyle: {
            color: "#FFFFFF",
          },
        },
        //不显示x坐标刻度
        axisTick: {
          show: false,
        },
      },
      yAxis: {
        type: "value",
        //不显示y轴线
        axisLine: {
          show: false,
        },
        //不显示y轴刻度线
        axisTick: {
          show: false,
        },
        //坐标轴名称的样式
        axisLabel: {
          color: "rgba(192,196,206",
          fontSize: 12,
          fontFamily: "Microsoft YaHei UI",
          fontWeight: "400",
        },
        //分割线样式
        splitLine: {
          show: true,
          lineStyle: {
            color: "#FFFFFF",
            type: "dashed",
          },
        },
      },
      series: [
        {
          data: this.dataY,
          type: "bar",
          //生成柱状图颜色
          itemStyle: {
            normal: {
              color: function (params: PdCAny) {
                // build a color map as your need.
                const colorList = [ "#409EFF","#E6A23C", "#F56C6C","#67C23A","#D16CF5",];
                return colorList[params.dataIndex];
              },
            },
          },
          // 柱状图的宽度
          barWidth: 32,
        },
      ],
    };
    // 使用刚指定的配置项和数据显示图表。
    this.myChart.setOption(option);
  }

监听窗口大小变化

 onResize() {
    addEvent("resize", this.resize, false);
    this.$once("hook:beforeDestroy", () => {
      removeEvent("resize", this.resize, false);
    });
  }

  resize() {
    if (this.myChart) {
      this.myChart.resize();
    } else {
      this.drawChartBar();
    }
  }

注意:要在子组件中将嵌套echarts图表的盒子设置width:100%;height:100%

 导入addEvent和removeEvent函数

import { addEvent, removeEvent } from "@/common/utils/utils";

 在utils文件中函数定义如下:

export function addEvent(type: PdCAny, handler: PdCAny, capture: PdCAny, element: PdCAny = window) {
    if (element.addEventListener) {
        element.addEventListener(type, handler, capture);
    } else if (element.attachEvent) {
        element.attachEvent('on' + type, handler);
    } else {
        element['on' + type] = handler;
    }
}

export function removeEvent(type: PdCAny, handler: PdCAny, capture: PdCAny, element: PdCAny = window) {
    if (element.removeEventListener) {
        element.removeEventListener(type, handler, capture);
    } else if (element.deattachEvent) {
        element.deattachEvent('on' + type, handler);
    } else {
        element['on' + type] = null;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖醋麻辣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值