解决vue 中 echart 在子组件中只显示一次的问题


Posted in Javascript onAugust 07, 2018

问题描述

一次项目开发过程中,需要做一些图表,用的是百度开源的 echarts。 vue推荐组件化开发,所以就把每个图表封装成子组件,然后在需要用到该图表的父组件中直接使用。

实际开发中,数据肯定都是异步获取的。所以我们在 mounted 生命周期中获取数据。对vue生命周期不熟悉的,可以去看一下我之前写一篇文章vue2.0项目实战(4)生命周期和钩子函数详解

由于父组件请求的数据并不是一成不变的,会根据不同的条件请求不同的数据,此时需要图表进行更新。

代码示例

在父组件中

// Main.vue
<template>
 <div>
  ...
  <Pie :pieData="fullList"></Pie>
  ...
 </div>
</template>
<script>
 import Pie from 'components/SourcePie'
 export default {
 components: {
 Pie
 },
 data(){
  return {
  fullList:{}
 }
 },
 mounted() {
 this._fullQuantity()
 },
 methods: {
 _fullQuantity(){
  // axios...
 }
 }
 }
</script>

在父组件中,通过api接口获得的数据传递给子组件。那么我们在子组件中:

// SourcePie.vue
<template>
 <div style="width:300px;height:260px" id="data_source_con" v-if="pieData"></div>
</template>
<script>
import echarts from 'echarts';
export default {
 name: 'dataSourcePie',
 data() {
 return {
  //
 };
 },
 props: {
 pieData: Object
 },
 mounted() {
 this.init()
 },
 methods: {
 init() {
  let _this = this;
  this.$nextTick(() => {
  var dataSourcePie = echarts.init(document.getElementById('data_source_con'));
  const option = {
   tooltip: {
   trigger: 'item',
   formatter: "{a} <br/>{b} : {c} ({d}%)",
   position: ['50%', '50%']
   },
   series: [{
   name: '实体统计',
   type: 'pie',
   radius: '50%',
   center: ['50%', '60%'],
   data: [{
    value: _this.pieData.videoNum,
    name: '影视数据'
    },
    {
    value: _this.pieData.albumNum,
    name: '专辑数据'
    },
    {
    value: _this.pieData.songNum,
    name: '歌曲数据'
    },
    {
    value: _this.pieData.novelNum,
    name: '小说数据'
    },
    {
    value: _this.pieData.presonNum,
    name: '人员数据'
    }
   ],
   itemStyle: {
    emphasis: {
    shadowBlur: 10,
    shadowOffsetX: 0,
    shadowColor: 'rgba(0, 0, 0, 0.5)'
    }
   }
   }]
  };
  dataSourcePie.setOption(option);
  window.addEventListener('resize', function() {
   dataSourcePie.resize();
  });
  });
 }
 }
};
</script>

我们发现第一次图表能正常显示,但是页面一刷新或者跳转到其它页面,再返回到该页面,图表就不显示了。

原因

自己当时没有想那么多为什么无法加载,因此在另一个父组件进行应用的时候,他是首屏就加载,数据不变动。

但是当数据变动之后,无法自动的更新图表。

由于 mounted 只会在挂载的时候执行一次,因此无法后续进行更新

解决办法

通过 watch 进行图表的更新

watch: {
 pieData() {
  this.$nextTick(() => {
  if (this.pieData) {
   this.init()
  }
  })
 }
 },

这样就能解决我们的问题了。

Javascript 相关文章推荐
用JavaScript编写COM组件的步骤
Mar 17 Javascript
jquery click([data],fn)使用方法实例介绍
Jul 08 Javascript
jquery 实现窗口的最大化不论什么情况
Sep 03 Javascript
JS中的form.submit()不能提交表单的错误原因
Oct 08 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
Sep 24 Javascript
详解webpack2+React 实例demo
Sep 11 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
Feb 08 Javascript
浅析Vue实例以及生命周期
Aug 14 Javascript
laravel-admin 与 vue 结合使用实例代码详解
Jun 04 Javascript
多个vue子路由文件自动化合并的方法
Sep 03 Javascript
layer.open回调获取弹出层参数的实现方法
Sep 10 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
Apr 26 Javascript
Nuxt配合Node在实际生产中的应用详解
Aug 07 #Javascript
React-router4路由监听的实现
Aug 07 #Javascript
JavaScript设计模式之职责链模式应用示例
Aug 07 #Javascript
JavaScript使用享元模式实现文件上传优化操作示例
Aug 07 #Javascript
JavaScript设计模式之模板方法模式原理与用法示例
Aug 07 #Javascript
opencv 识别微信登录验证滑动块位置
Aug 07 #Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
Aug 07 #Javascript
You might like
用PHP将数据导入到Foxmail
2006/10/09 PHP
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
php数组编码转换示例详解
2014/03/11 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
PHP中Enum(枚举)用法实例详解
2015/12/07 PHP
php实现购物车功能(下)
2016/01/05 PHP
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
js实现鼠标经过表格行变色的方法
2015/05/12 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
2016/08/11 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
Python中的迭代器漫谈
2015/02/03 Python
Python中的XML库4Suite Server的介绍
2015/04/14 Python
python实现在windows下操作word的方法
2015/04/28 Python
Python制作数据导入导出工具
2015/07/31 Python
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
Python字典底层实现原理详解
2019/12/18 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
澳大利亚票务和娱乐市场领导者:Ticketmaster
2017/03/03 全球购物
expedia比利时:预订航班+酒店并省钱
2018/07/13 全球购物
历史系毕业生自荐信
2013/10/28 职场文书
材料加工工程求职信
2014/02/19 职场文书
怎么写好自荐书
2014/03/02 职场文书
羽毛球比赛策划方案
2014/06/13 职场文书
Python自动化之批量处理工作簿和工作表
2021/06/03 Python