解决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+Dhtml:WEB程序员简易开发工具包(预先体验版)
Nov 07 Javascript
通过jQuery源码学习javascript(二)
Dec 27 Javascript
JQuery控制Radio选中方法分析
May 29 Javascript
localStorage实现便签小程序
Nov 28 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
Jan 22 Javascript
js实现百度搜索提示框
Feb 05 Javascript
微信小程序 数据遍历的实现
Apr 05 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
Sep 03 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
Sep 21 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
Feb 10 Javascript
vue将单页面改造成多页面应用的方法
Nov 25 Javascript
ES6 Object属性新的写法实例小结
Jun 25 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中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
php遍历文件夹和文件列表示例分享
2014/03/11 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
Laravel框架源码解析之反射的使用详解
2020/05/14 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
js限制文本框的输入内容代码分享(3类)
2015/08/20 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
基于JavaScript实现百叶窗动画效果不只单纯flas可以实现
2016/02/29 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
React实现全局组件的Toast轻提示效果
2018/09/21 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
Python简单实现安全开关文件的两种方式
2016/09/19 Python
Python编写一个优美的下载器
2018/04/15 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
在Python中增加和插入元素的示例
2018/11/01 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
python爬虫beautifulsoup解析html方法
2020/12/07 Python
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
企业安全生产责任书范本
2014/07/28 职场文书
软件测试专业推荐信
2014/09/18 职场文书
神龙架导游词
2015/02/11 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
Python爬取科目四考试题库的方法实现
2021/03/30 Python