Vue中使用Echarts可视化图表,宽度自适应解决方案

一、问题阐述:

开发H5项目中应用到Echarts数据可视化,由于H5主要使用在手机,屏幕宽度大大限制了图表的展现,问题如下。

上图中x轴的数据是动态的,从2022年切换到2021年数据变化,此时如果x轴的数据过多就会显得格外拥挤。

二、解决思路:

我的解决方案是,在放置Echarts的容器(div)外层再套一层容器(div),外层容器宽度固定设置手机屏幕宽,并设置溢出显示滚动条(width: 100%;overflow: auto),内层Echarts容器宽度初始宽为100%,如果数据大于设定的量时,就加大放置Echarts的容器宽度。

本以为能顺利解决问题时,然而效果并不尽人意,效果如下。

1. 容器宽度改变了

2. 滚动条出现

3. 图表未加宽到容器宽度

其实每次更改筛选条件都会从新创建实例,但Echarts图表并未按照预期加宽,感觉就像缓存了最初设定的容器宽度一样。

仔细看文档才发现,原来Echarts图表本身是提供了一个resize的函数专门处理这类问题。

三、最终效果:

完整代码如下

<!-- 学生统计 折线图 HTML部分 -->
<div class="stuCensus_box">
   <div
    id="student_census"
    class="student_census"
    ref="student_census"
   ></div>
</div>

// js部分 学生统计 折线图
initStudentCensus() {
// 根据x轴内容长短设定echarts的宽度
   if (this.stuCensus_xAxis.length > 9) {
     this.$refs.student_census.style.width = "200%";
   } else if (this.stuCensus_xAxis.length > 5) {
     this.$refs.student_census.style.width = "130%";
   } else {
     this.$refs.student_census.style.width = "100%";
   }

   var myChart = this.$echarts.init(this.$refs.student_census);

   var option = {
     tooltip: {
       trigger: "axis",
       extraCssText: "max-height: 200px; overflow: auto;", // 设置悬浮窗样式
       position: function (pos, params, dom) {
       dom.style.pointerEvents = "auto"; // 修改悬浮窗不可绑定事件的css属性
       },
     },
     legend: {
       type: "scroll",
       data: this.stuCensus_legend,
     },
     grid: {
       top: "14%",
       left: "0",
       right: "1%",
       bottom: "3%",
       containLabel: true,
     },
     xAxis: {
       type: "category",
       data: this.stuCensus_xAxis,
       axisLabel: { rotate: 45 },
     },
     yAxis: {
       type: "value",
       axisLabel: axisLabel,
     },
     series: this.stuCensusSeries,
   };
   myChart.setOption(option, true);
   myChart.resize(); // 调用此API更新echarts的宽高才能生效
},

1. 用$refs设定容器宽度。

2. setOption创建可视化图表实例

3. resize重绘可视化图表

效果如下

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3是一种流行的JavaScript框架,它允许您构建交互式Web应用程序。而ECharts是一款开源的可视化库,可以提供动态的图表,使Web应用程序变得更加生动和具有吸引力。对于Vue3使用ECharts来说,当我们的图表需要自适应div大小时,我们可以采用如下的步骤来进行实现: 首先,我们需要在Vue3项目安装ECharts库。可以使用npm或yarn等方式进行安装,例如: `npm install echarts` `yarn add echarts` 然后我们需要将ECharts图表放入一个容器,这个容器就是我们要自适应大小的div。我们可以使用Vue3的计算属性来监测这个div的大小变化。如下代码: ``` <template> <div ref="chartContainer" :style="`width: ${containerWidth}px;height:${containerHeight}px`"></div> </template> <script> import * as echarts from 'echarts'; export default { data() { return { containerWidth: 0, containerHeight: 0, chart: null }; }, computed: { chartContainer() { return this.$refs.chartContainer; } }, methods: { initChart() { if (this.chart) { this.chart.resize(); } else { this.chart = echarts.init(this.chartContainer); this.chart.setOption(this.chartOption); } } }, watch: { chartOption: { handler() { this.initChart(); }, deep: true } }, mounted() { this.containerWidth = this.chartContainer.offsetWidth; this.containerHeight = this.chartContainer.offsetHeight; this.initChart(); window.addEventListener('resize', () => { this.containerWidth = this.chartContainer.offsetWidth; this.containerHeight = this.chartContainer.offsetHeight; this.chart.resize(); }); } }; </script> ``` 这个例子,我们使用Vue3的响应式数据,监测了div容器的大小变化。在div容器挂载到DOM树上之后,我们会调用initChart()方法来初始化ECharts图表。在调整大小时,我们会调用chart.resize()方法重新渲染图表。 总体而言,使用这种方法可以使我们的ECharts图表很好地适应不同大小的div容器,并可以自动适应大小。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值