前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【问题解决】解决 ECharts 图表窗口自适应与数据不渲染问题

【问题解决】解决 ECharts 图表窗口自适应与数据不渲染问题

原创
作者头像
sidiot
修改于 2024-04-16 14:09:50
修改于 2024-04-16 14:09:50
2.2K00
代码可运行
举报
文章被收录于专栏:技术大杂烩技术大杂烩
运行总次数:0
代码可运行

前言

在项目中使用 ECharts 遇到了一些问题,包括图表不会随着窗口大小变化而变化,以及父组件向子组件传值时,ECharts 中的值不会被同步渲染等,因此写本博文进行记录;

博文中的所有代码全部收集在博主的 GitHub 仓库中,相关技术栈专栏如下:

快速上手 ECharts

在分析解决问题前,我们先复现一下情景。根据 ECharts 的官方文档,我们快速的在 Vue 中构建 ECharts 图表。

首先,根据官方文档的提示,在下载好的 ECharts 压缩包中提取 dist/echarts.js 放置在自己项目的目录下,并在项目中进行引用,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<head>
    <meta charset="UTF-8">
    <title>ECharts 入门示例</title>
    <script src="../../vue.js"></script>
    <script src="../../echarts.js"></script>
</head>

接着,为 ECharts 准备一个 DOM 容器,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="main" style="width: 100%; height:400px;"></div>

最后,通过 echarts.init 方法初始化一个 ECharts 实例并通过 setOption 方法生成一个简单的柱状图,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script>
    const app = new Vue({
        el: '#app',
        data: {
            option: {
                title: {
                    text: 'ECharts 入门示例'
                },
                tooltip: {},
                legend: {
                    data: ['销量']
                },
                xAxis: {
                    data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
                },
                yAxis: {},
                series: [
                    {
                        name: '销量',
                        type: 'bar',
                        data: [5, 20, 36, 10, 10, 20]
                    }
                ]
            }
        },
        mounted() {
            this.initChart()
        },
        methods: {
            initChart() {
                let myChart = echarts.init(document.getElementById('main'));
                myChart.setOption(this.option);
            }
        }
    })
</script>

运行结果:

【ECharts 入门示例】代码点击此处跳转

图表自适应

在上述构建的场景中,图表并不会随着窗口大小的变化而变化,如下所示:

为了实现图表的窗口自适应功能,我们需要监听窗口的大小变化,并且同时调整图表的大小,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mounted() {
    this.initChart()
    if (this.autoResize) {
        window.addEventListener('resize', this.resizeChart)
    }
},
methods: {
    ...
    resizeChart() {
        console.log('chart resize!')
        this.chart.resize()
    }
}

在上述代码中,autoResize 表示是否启动自适应功能,window.addEventListener('resize', this.resizeChart) 监听窗口的大小变化,如果窗口大小发生改变,则调用 resizeChart() 方法,resizeChart() 方法中使用了 ECharts 自带的调整图表大小的方法 resize()

运行结果:

不过眼尖的读者已经发现了,只是缩小了一点窗口的大小,该方法就被调用了85次,这对我们来说是没有必要的,因为我们不需要实时的去调整窗口大小,只需要在一定时间内完成调整即可,因此引入 loadsh 的防抖功能,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
methods: {
    ...
    resizeChart: _.debounce(function () {
        console.log('chart resize!')
        this.chart.resize()
    }, 100)
}

运行结果:

除了使用 loadsh 的防抖功能来节约资源,提高性能之外,还可以在 Vue 实例被销毁之前,取消监控并销毁 ECharts 实例,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
beforeDestroy() {
    if (!this.chart) {
        return
    }
    if (this.autoResize) {
        window.removeEventListener('resize', this.resizeChart)
    }
    this.chart.dispose()
    this.chart = null
}

【ECharts 图表自适应】代码点击此处跳转

数据不渲染

在前面的内容中,我们成功地开发了一个适用于特定场景的 Echarts 图表组件。为了让这个组件更具普适性和扩展性,我们计划对其进行一些改进和优化。

首先,我们将 div 元素的属性改进成动态绑定的方式,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div :class="className" :style="{ height: height, width: width }"></div>

然后,设置组件的 props 配置,这些 props 允许在父组件中给子组件传递数据,同时也为这些属性提供了默认值以防止属性未被传递时出现错误,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
props: {
  className: {
    type: String,
    default: "DataChild",
  },
  width: {
    type: String,
    default: "100%",
  },
  height: {
    type: String,
    default: "500px",
  },
  autoResize: {
    type: Boolean,
    default: true,
  },
  series: {
    type: Array,
    default: null,
  },
},

在上述代码中,父组件传入不同的 series 数值,可以动态的改变 ECharts 图表。

接着,我们开始构建父组件,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <data-child :series="this.series"></data-child>
</template>

<script>
import DataChild from "./DataChild.vue";

export default {
  name: "DataParent",
  components: {
    DataChild,
  },
  data() {
    return {
      series: [
        {
          name: "..",
          type: "..",
          data: [],
        },
      ],
    };
  },
  created() {
    this.fetchData();
  },
  methods: {
    fetchData() {
      ...
    },
  },
};
</script>

在上述代码中,通过 fetchData() 方法来获取需要渲染数据,这里的话使用 POSTMAN 来模拟后端服务器发送数据。

创建一个模拟服务器,设置 API 接口与响应数据:

对模拟服务器进行相关配置:

通过访问 API 接口来获取数据:

同时也能查看到请求日志:

在 Vue 中,我们通过 axios 来请求接口,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fetchData() {
  const url = "";
  axios
    .get(url + "/test/data")
    .then((resp) => {
      this.series[0].data = resp.data.data;
      console.log(this.series);
    })
    .catch((err) => {
      console.log(err);
    });
},

然而出现了点问题,数据是请求到了,但是 ECharts 图表并没有渲染上:

我们在子组件中也打印一下相关数据,确认父组件的数据是否传递到子组件中,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log('Child Data Before:', this.series)
this.initChart();
console.log('Child Data After:', this.series)

initChart() {
  ...
  console.log('Child Data:', this.series)
  this.chart.setOption(this.option);
},

子组件也确实获取到了数据,那为什么图表不渲染数据呢?

这是因为,当父组件需要通过异步 AJAX 请求获取数据来设置子组件的 props 属性时,可能会遇到子组件渲染速度快于 AJAX 请求返回的情况。这种情况下,父组件在 createdmounted 生命周期钩子函数执行时,子组件可能已经开始渲染,但是尚未接收到通过 AJAX 请求获得的数据,因此只有默认的 props 值会被子组件使用。

可以通过在父子组件中打点来得知程序的运行情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// parent
created() {
  console.log("Parent Created Before");
  this.fetchData();
  console.log("Parent Created After");
},
fetchData() {
  axios
    ...
    .then((resp) => {
      ...
      console.log("Parent Fetch Data");
    })
    ...
},

// child
created() {
  console.log("Child Created");
},
mounted() {
  console.log("Child Mounted Before");
  this.initChart();
  console.log("Child Mounted After");
  ...
},
initChart() {
  ...
  console.log('Child Init Data')
  ...
},

运行结果:

通过上述的运行结果可知,正如我们所预料的那样,由于父组件的 fetchData() 方法使用了异步请求,因此程序会一直执行下去,并不会因为没有获取到数据而阻塞,当子组件完成图表渲染 initChart() 后,父组件才请求到数据,**因此才造成了子组件图表中的数据不渲染问题**,子组件图表渲染时使用的数据是 props 中的默认值,即空数组。

那如何解决这个问题呢?其实很简单,我们只要监听对应的属性即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
watch: {
  option: {
    handler(newVal, oldVal) {
      if (this.chart) {
        if (newVal) {
          this.chart.setOption(newVal);
        } else {
          this.chart.setOption(oldVal);
        }
      } else {
        this.initChart();
      }
    },
    deep: true,
  },
},

上述代码之所以监听的是 option 而不是 series,是因为在初始化图表时已经进行了赋值 this.option.series = this.series;series 本身是 option 的属性,通过 deep: true 也可以监听到 series 发生变化,同时监听 option 还能监听到其他属性。

运行结果:

【ECharts 数据不渲染】代码点击此处跳转

后记

以上就是 解决 ECharts 图表窗口自适应与数据不渲染问题 的所有内容了,希望本篇博文对大家有所帮助!欢迎大家持续关注我的博客,一起分享学习和成长的乐趣!✨

代码:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Element Tabs 标签页 展示Echart 并随窗口变化自适应
1、如何在一个div中展示不同的图表  (点击tab时为Chart组件赋值,并传给子组件,子组件监听数据变化并在 $nextTick 中重新绘制表格)
tianyawhl
2020/03/09
2.1K0
Element Tabs 标签页 展示Echart 并随窗口变化自适应
Vue ECharts 基本数据图表绘制详解:让数据飞起来
大家好,欢迎来到数据可视化的世界!如果你以为数据就是冷冰冰的数字,那你就大错特错了。数据,可是有灵魂的!只要给它一副好看的外衣,比如我们今天要聊的图表,它们立马就能从沉睡中醒来,给你跳一支「数据之舞」。
繁依Fanyi
2024/09/10
2940
ECharts中Map(地图)样式配置、渐变色生成
ECharts是我们常用的图表控件,功能特别强大,每次使用都要查API比较繁琐,这里就记录开发中常用的配置。
码客说
2024/03/29
12.8K0
ECharts中Map(地图)样式配置、渐变色生成
Echarts——VUE中非根节点时不显示图表也无报错
因为之前的封装都是直接作为根节点封装的,使用this.el,非根组件的时候使用this.refs.xx指定即可
思索
2024/08/16
1040
手拉手,用Vue开发动态刷新Echarts组件
需求背景:dashboard作为目前企业中后台产品的“门面”,如何更加实时、高效、炫酷的对统计数据进行展示,是值得前端开发工程师和UI设计师共同思考的一个问题。今天就从0开始,封装一个动态渲染数据的Echarts折线图组件,抛砖引玉,一起来思考更多有意思的组件。 准备工作 项目结构搭建 因为生产需要(其实是懒),所以本教程使用了 vue-cli 进行了项目的基础结构搭建。 npm install -g vue-cli vue init webpack vue-charts cd vue-charts
司想君
2018/06/13
4.8K0
React下ECharts的数据驱动探索
使用过Vue React框架我们就知道,我们不再更改某个DOM的innertext和innerhtml属性就能完成视图的改变,两者都是通过对状态的改变,唤起 virtualDOM 的diff方法,最终生成patch反应到真实DOM上。区别是Vue通过依赖收集观测数据的变化,而React是通过调用setState方法,不要小看这个区别。在结合ECharts的过程中,有着极大的不同。
MrTreasure
2018/08/09
1.1K0
React下ECharts的数据驱动探索
Vue 折腾记 - (7) 写一个挺不靠谱的Vue-Echarts组件
上基友社区看了下,发现对echarts的封装都是打包进去的...想想就还是算了.. 图表这货.说实在的,若不是整个系统大量用到,打包进去没必要...
CRPER
2018/08/28
5060
Vue 折腾记 - (7) 写一个挺不靠谱的Vue-Echarts组件
用Echarts打造一个轮播图!
https://echarts.apache.org/zh/option.html
小F
2020/10/20
1.5K0
用Echarts打造一个轮播图!
mpvue——动态渲染echarts图表
使用mpvue-echarts来写图表,那个F2再提醒自己下要踩坑不能忘记。遇到了一个问题就是数据不能动态的去渲染,这个其实官方给了我们对应的方法
思索
2024/08/16
1970
Echarts中数据集的使用
https://echarts.apache.org/handbook/zh/concepts/dataset
码客说
2023/10/19
4470
Vue打包后Echarts图表不显示问题解决
最近发现一奇怪问题,正常本机测试情况下,echarts图表显示的没问题。但是只要打包后部署到nginx里,第一次首页加载没问题,但进入其他tab页面再返回首页时,echarts图表就是显示不出来了。监测控制台也没有任何的错误输出。
杨永贞
2022/01/07
2.4K0
echarts常用功能封装|抽象为mixin
目前已解锁以下功能: 初始化echarts(initChart) 获取echarts参数配置(getOption) 生成echarts图表(setOption) 监听resize事件触发echarts图表更新 加载中loading // charts.js import echarts from 'echarts' export default { computed: { // 初始化echarts getChart () { return this.$echarts.in
大前端分享
2020/10/25
8030
【Vue.js——ECharts图表】学海无涯(蓝桥杯真题-2280)【合集】
选中 index.html 右键启动 Web Server 服务(Open with Live Server),让项目运行起来。
Rossy Yan
2025/01/27
890
【Vue.js——ECharts图表】学海无涯(蓝桥杯真题-2280)【合集】
绝对干货~!学会这些Vue小技巧,可以早点下班和女神约会了
每天都在写代码,虽然手底下马不停蹄的敲,但是该来的加班还是会来的,如何能更快的完成手头的工作,提高自己的开发效率,今天小编给大家带来了这几个Vue小技巧,终于可以在六点像小鹿一样奔跑着下班了。
前端进击者
2021/07/27
1.2K0
Vue使用Echarts详情
Vue.js是一种流行的JavaScript框架,它为前端开发人员提供了一种创建优雅、高效和可扩展Web应用程序的方式。而ECharts则是一个基于JavaScript的可视化库,它可以帮助开发人员轻松地创建各种各样的图表和数据可视化。在这篇文章中,我们将介绍如何在Vue.js应用程序中使用ECharts,并为您提供一些使用示例。
世间万物皆对象
2024/03/20
1800
「后端小伙伴来学前端了」Vue中学会使用Echarts生成各种各样的图表,得学学了,必须要会的基本操作了
如果之前没有接触过Vue或者Echarts 的小伙伴,了解方式无疑就是Echarts官方文档或各大搜索引擎了。
宁在春
2022/10/31
6770
「后端小伙伴来学前端了」Vue中学会使用Echarts生成各种各样的图表,得学学了,必须要会的基本操作了
图表列表性能优化:可视化区域内最小资源消耗
之前写过《懒加载优化:JavaScript IntersectionObserver API监听元素是否可见》,基于上一篇文章,做个滚动懒加载完全不是问题。
周陆军
2021/06/26
2.4K0
Ecarts在Vue中使用父子组件异步传值
MyEchart.vue (注意里边的注释,采用异步更新值来更新,防止父子组件数据不同步)
知识浅谈
2024/05/25
1390
Ecarts在Vue中使用父子组件异步传值
福建省大数据职业技能大赛电商数据可视化-接口数据源
此项目基于vue3,结合echarts获取接口(根据跨域文件获取相关数据),数据进行数据可视化
码农GT038527
2024/08/31
3824
福建省大数据职业技能大赛电商数据可视化-接口数据源
Vue 使用中的小技巧
在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发。下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~
前端下午茶
2018/10/22
1.4K0
推荐阅读
相关推荐
Element Tabs 标签页 展示Echart 并随窗口变化自适应
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档