解决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显示隐藏层比较不错的方法分析
Sep 30 Javascript
JavaScript 获取事件对象的注意点
Jul 29 Javascript
浅析jquery的作用与优势
Dec 02 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
Jun 13 Javascript
javascript跨域原因以及解决方案分享
Apr 08 Javascript
浅谈javascript中call()、apply()、bind()的用法
Apr 20 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
Oct 21 Javascript
jQuery旋转木马式幻灯片轮播特效
Dec 04 Javascript
js实现楼层效果的简单实例
Jul 15 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
Aug 08 Javascript
基于iScroll实现下拉刷新和上滑加载效果
Jul 18 Javascript
深入分析JavaScript 事件循环(Event Loop)
Jun 19 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
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
2016/01/07 PHP
php实现图片缩略图的方法
2016/03/29 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
node.js中的emitter.emit方法使用说明
2014/12/10 Javascript
Javascript如何判断数据类型和数组类型
2016/06/22 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
react-router4 嵌套路由的使用方法
2017/07/24 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
js中int和string数据类型互相转化实例
2019/01/16 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现倒计时的示例
2014/02/14 Python
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
python实现的简单窗口倒计时界面实例
2015/05/05 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
Python之修改图片像素值的方法
2019/07/03 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
机械制造与自动化应届生求职信
2013/11/16 职场文书
幼师自我鉴定
2014/02/01 职场文书
天鹅的故事教学反思
2014/02/04 职场文书
社区国庆节活动方案
2014/02/05 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
党的群众路线教育实践活动总结
2014/10/30 职场文书