解决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 相关文章推荐
各种效果的jquery ui(接口)介绍
Sep 17 Javascript
jQuery 学习入门篇附实例代码
Mar 16 Javascript
Flash图片上传组件 swfupload使用指南
Mar 14 Javascript
JavaScript函数节流概念与用法实例详解
Jun 20 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
Dec 27 Javascript
Axios学习笔记之使用方法教程
Jul 21 Javascript
zTree树形菜单交互选项卡效果的实现方法
Dec 25 Javascript
jQuery简单实现向列表动态添加新元素的方法示例
Dec 25 jQuery
使用mpvue搭建一个初始小程序及项目配置方法
Dec 03 Javascript
JavaScript一元正号运算符示例代码
Jun 30 Javascript
Vue中的循环及修改差值表达式的方法
Aug 29 Javascript
Python版实现微信公众号扫码登陆
May 28 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原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
2019/06/05 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
走出JavaScript初学困境—js初学
2008/12/29 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
学习python分支结构
2019/05/17 Python
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
The North Face北面英国官网:美国著名户外品牌
2017/12/13 全球购物
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
ProForm英国站点:健身房和健身器材网上商店
2019/06/05 全球购物
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
用C语言实现文件读写操作
2013/10/27 面试题
就业自我评价
2014/02/04 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
倡议书格式
2014/08/30 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
房屋买卖协议样本
2014/11/16 职场文书
毕业典礼邀请函
2015/01/31 职场文书
出国留学自荐信模板
2015/03/06 职场文书
2015年度销售个人工作总结
2015/03/31 职场文书
调解书格式范本
2015/05/20 职场文书
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python