解决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 相关文章推荐
js从10种颜色中随机取色实现每次取出不同的颜色
Oct 23 Javascript
我的Node.js学习之路(四)--单元测试
Jul 06 Javascript
Node.js插件的正确编写方式
Aug 03 Javascript
jQuery插件Validate实现自定义校验结果样式
Jan 18 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
Jul 09 Javascript
Bootstrap表单控件使用方法详解
Jan 11 Javascript
基于JavaScript实现的顺序查找算法示例
Apr 14 Javascript
AngularJS的脏检查深入分析
Apr 22 Javascript
详解微信小程序 相对定位和绝对定位
May 11 Javascript
解决IE7中使用jQuery动态操作name问题
Aug 28 jQuery
React Native中的RefreshContorl下拉刷新使用
Oct 09 Javascript
微信小程序利用for循环解决内容变更问题
Mar 05 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求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
JavaScript模拟push
2016/03/06 Javascript
使用Bootstrap框架制作查询页面的界面实例代码
2016/05/27 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
2018/09/27 Javascript
深入理解Angularjs 脏值检测
2018/10/12 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
九步学会Python装饰器
2015/05/09 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
2018/08/01 Python
python实现图片识别汽车功能
2018/11/30 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
python实现学生成绩测评系统
2020/06/22 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
MySQL面试题目集锦
2016/04/14 面试题
企业晚会策划方案
2014/05/29 职场文书
应急管理培训方案
2014/06/12 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
高中生物教学反思
2016/02/20 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
导游词之山西关帝庙
2019/11/01 职场文书