解决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 Event学习第六章 事件的访问
Feb 07 Javascript
JavaScript字符串String和Array操作的有趣方法
Dec 18 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
Nov 25 Javascript
javascript随机之洗牌算法深入分析
Jun 07 Javascript
使用jsonp完美解决跨域问题
Nov 27 Javascript
js贪吃蛇游戏实现思路和源码
Apr 14 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
Dec 30 Javascript
javascript使用btoa和atob来进行Base64转码和解码
Mar 20 Javascript
BootStrap中Table隐藏后显示问题的实现代码
Aug 31 Javascript
ECMAScript6变量的解构赋值实例详解
Sep 19 Javascript
详解Vue单元测试Karma+Mocha学习笔记
Jan 31 Javascript
JavaScript ES6箭头函数使用指南
Dec 30 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
Mysql中limit的用法方法详解与注意事项
2008/04/19 PHP
php实现通过ftp上传文件
2015/06/19 PHP
深入理解PHP中的Streams工具
2015/07/03 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
2016/06/01 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
python命名空间(namespace)简单介绍
2019/08/10 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
django正续或者倒序查库实例
2020/05/19 Python
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
物业经理求职自我评价
2013/09/22 职场文书
大学毕业生通用求职信
2013/09/28 职场文书
四群教育工作实施方案
2014/03/26 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
社区禁毒工作方案
2014/06/02 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python
js 实现验证码输入框示例详解
2022/09/23 Javascript