解决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 相关文章推荐
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
Nov 06 Javascript
jQuery动态添加、删除元素的方法
Jan 09 Javascript
jquery结合CSS使用validate实现漂亮的验证
Jan 29 Javascript
js实现仿百度瀑布流的方法
Feb 05 Javascript
javascript判断变量是否有值的方法
Apr 20 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
Jun 08 Javascript
全面解析标签页的切换方式
Aug 21 Javascript
用move.js库实现百叶窗特效
Feb 08 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
May 02 Javascript
JQuery实现定时刷新功能代码
May 09 jQuery
Vue props用法详解(小结)
Jul 03 Javascript
vue 数据双向绑定的实现方法
Mar 04 Vue.js
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 中的批处理的实现
2007/06/14 PHP
判断PHP数组是否为空的代码
2011/09/08 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
javascript window对象属性整理
2009/10/24 Javascript
JS window对象的top、parent、opener含义介绍
2013/12/03 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
ES6的Fetch异步请求的实现方法
2018/12/07 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
Python获取文件ssdeep值的方法
2014/10/05 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
python运行时间的几种方法
2016/06/17 Python
Python下的Softmax回归函数的实现方法(推荐)
2017/01/26 Python
Python 调用 Windows API COM 新法
2019/08/22 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
Moda Italia荷兰:意大利男士服装
2019/08/31 全球购物
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
毕业生怎样写好自荐信
2013/11/11 职场文书
普通大学毕业生自荐信范文
2014/02/23 职场文书
师德师风演讲稿
2014/05/05 职场文书
优秀的个人求职信范文
2014/05/09 职场文书
电子商务专业求职信
2014/07/10 职场文书
转让协议书范本
2014/09/13 职场文书
国际政治学专业推荐信
2014/09/26 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
创业计划书之溜冰场
2019/10/25 职场文书
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript
基于Redis的List实现特价商品列表功能
2021/08/30 Redis