Echarts 多个图表resize()方法只生效一个,如何自适应父级div的宽高

1、问题描述

处理在多个echarts图表下 resize()方法只生效一个,最后一个的行为会覆盖前面的。多个图表自适应有两种情况:

第一种情况是改变窗口大小要多个图表自适应,

第二种情况是窗口大小不变,整个页面分为两部分,左边菜单导航树形宽度占20%,右边图表宽度占80%,当左边菜单宽度变为10%时图表自适应变为90%;

2、思路分析

(1)、改变窗口大小:

                 方法 1、遍历生成的折线图的Dom,通过getInstanceByDom方法获取dom容器,调用每个图形的resize方法,在window.onresize监听窗口变化时,调用getEchartObj()方法

                 方法2、因为采用DOM一级绑定方式会只适应一个图表,在使用window.onresize监听窗口变化时,要使用DOM二级绑定方式:addEventListener方式;(注释的位置)

(2)、改变div的宽度:

3、解决办法

改变窗口大小:

(1)当多个图形在一个vue组件中时:(方法 1\方法2)

methods:{
    //饼图分析
    drawPie() {
      let myChart = echarts.init(this.$refs['payWayRef']);
      // 绘制图表
      let option = {
        title: {
          text: "分析",
          left: "center"
        },
        tooltip: {
          trigger: "item",
          formatter: `{a}<br/>{b}:{c}({d}%)`
        },
        legend: {
          orient: "vertical",
          left: "left",
          selected: this.legendData
        },
        toolbox: {
          show: true,
          feature: {
            // dataView: { readOnly: false },
            restore: {},
            saveAsImage: {}
          }
        },
        series: []
      };
      myChart.setOption(option);
      // window.addEventListener("resize",()=>{
      //   myChart.resize()
      // })
    },
    //曲线图分析
    drawLine(data) {
      // this.dateArr.pop();
      let lineCount = data.lineCount;
      let lineMoney = data.lineMoney;
      let myChart = echarts.init(this.$refs["payWayLineRef"]);
      // 绘制图表
      let option = {
        title: {
          text: "分析",
          left: "center"
        },
        tooltip: {
          trigger: "axis"
        },
        legend: {
          type: "scroll",
          left: "left"
        },
        toolbox: {
          show: true,
          feature: {
            // dataView: { readOnly: false },
            magicType: { type: ["line", "bar"] },
            restore: {},
            saveAsImage: {}
          }
        },
        grid: {
          right: "15%"
        },
        xAxis: {
          type: "category",
          data: this.dateArr,
          name: "月份"
        },
        yAxis: [
          {
            type: "value",
            name: "笔数",
            nameLocation: "start",
            nameGap: 30,
            position: "left",
            splitLine: false
          },
        ],
        series: [
          {
            name: "笔数",
            data: lineCount,
            yAxisIndex: 0,
            type: "line"
          },
          {
            name: "金额",
            data: lineMoney,
            yAxisIndex: 1,
            type: "bar"
          }
        ]
      };
      myChart.setOption(option);
      // window.addEventListener("resize",()=>{
      //   myChart.resize()
      // })
    },
    //处理多个图形的自适应
    getEchartObj(){
        let arr = ['payWayRef',"payWayLineRef"]
        arr.map(v => {
        let  _ref=this.$refs[v];//遍历生成的折线图的Dom
        //通过getInstanceByDom方法获取dom容器
        let myEchars = _ref?echarts.getInstanceByDom(_ref):undefined;
        if(myEchars!== undefined){
          myEchars.resize();
        }
      });
    }
}
mounted(){
    this.$nextTick(()=>{
        window.onresize = ()=>{
            this.getEchartObj()
        }
    })
}

(2)当多个图形在不同子组件中时:(父组件/多个子组件)


//父组件  father
//子组件1   son1
//子组件2     son2

import echarts  form "echarts"


//父组件主要代码块

<son1 ref='son1'></son1>
<son2 ref='son2'></son2>

mounted(){
    this.$nextTick(()=>{
        window.onresize = ()=>{
            this.$refs.son1.reResizeFn()
            this.$refs.son2.reResizeFn()
        }
    })
}


//son1子组件主要代码块(echarts为引入的echarts对象)

    <div id='echart1'></div>

   //处理多个图形的自适应
    reResizeFn(){
        let  _ref=document.getElementById("echart1")
        //通过getInstanceByDom方法获取dom容器
        let myEchars = _ref?echarts.getInstanceByDom(_ref):undefined;
        if(myEchars!== undefined){
          myEchars.resize();
        }
    }


//son2子组件主要代码块
    <div id='echart1'></div>

    //处理多个图形的自适应
    reResizeFn(){
        let  _ref=document.getElementById("echart2")
        //通过getInstanceByDom方法获取dom容器
        let myEchars = _ref?echarts.getInstanceByDom(_ref):undefined;
        if(myEchars!== undefined){
          myEchars.resize();
        }
    }

改变div的宽度:

(1)左侧菜单,右侧内容的场景

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Echarts一个功能强大的数据可视化库,能够生成各种类型的图表。在Vue3框架下使用Echarts绘制多个图表时,可以实现自适应的效果。具体实现方法如下: 第一步,安装Echarts和Vue3,可以通过npm安装。使用以下命令: ``` npm install echarts --save npm install vue@next --save ``` 第二步,在Vue3中使用Echarts,需要在组件上挂载ref属性,在mounted生命周期函数中初始化Echarts图表。示例代码如下所示: ``` <template> <div ref="chartDom"></div> </template> <script> import * as echarts from 'echarts'; export default { name: 'EchartsChart', mounted() { const chartDom = this.$refs.chartDom; const myChart = echarts.init(chartDom); // 以下为Echarts图表配置项和数据 } } </script> ``` 第三步,使用Vue3的响应式数据,监听窗口大小的变化,并在窗口大小发生改变时重新绘制Echarts图表。示例代码如下所示: ``` <template> <div ref="chartDom"></div> </template> <script> import { onMounted, onBeforeUnmount, ref } from 'vue'; import * as echarts from 'echarts'; export default { name: 'EchartsChart', setup() { const chartDom = ref(null); let myChart; onMounted(() => { myChart = echarts.init(chartDom.value); window.addEventListener('resize', handleChartResize); handleChartResize(); }); onBeforeUnmount(() => { window.removeEventListener('resize', handleChartResize); }); function handleChartResize() { myChart.resize(); } return { chartDom, }; }, }; </script> ``` 通过以上方法,即可实现多个Echarts图表自适应效果。在Vue3的setup函数中,使用ref定义响应式的DOM节点,并在mounted函数中初始化Echarts实例。使用onMounted和onBeforeUnmount函数进行生命周期监听,监听窗口大小的变化并在窗口大小发生改变时重新绘制图表。最终返回chartDom,即可在模板中使用。<br>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值