解决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 相关文章推荐
JSON 入门指南 想了解json的朋友可以看下
Aug 26 Javascript
js给onclick事件赋值,动态传参数实例解说
Mar 28 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
Aug 30 Javascript
php中给js数组赋值方法
Mar 10 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
Sep 01 Javascript
JavaScript检测鼠标移动方向的方法
May 22 Javascript
js 性能优化之快速响应的用户界面
Feb 15 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
Mar 04 Javascript
如何编写jquery插件
Mar 29 jQuery
vue项目中jsonp跨域获取qq音乐首页推荐问题
May 30 Javascript
微信小程序之自定义组件的实现代码(附源码)
Aug 02 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
Oct 24 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
PHP4实际应用经验篇(1)
2006/10/09 PHP
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
CI框架常用方法小结
2016/05/17 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
Jquery post传递数组方法实现思路及代码
2013/04/28 Javascript
如何使用Jquery获取Form表单中被选中的radio值
2013/08/09 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
JavaScript实现下拉列表
2021/01/20 Javascript
[01:56]无止竞 再出发——中国军团出征2017年DOTA2国际邀请赛
2017/07/05 DOTA
Python计算两个日期相差天数的方法示例
2017/05/23 Python
Python 和 JS 有哪些相同之处
2017/11/23 Python
对python程序内存泄漏调试的记录
2018/06/11 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
Derek Rose官网:英国高档睡衣、家居服和内衣品牌
2020/01/18 全球购物
借款协议书
2014/04/12 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
企业员工辞职信范文
2015/05/12 职场文书
Python 内置函数速查表一览
2021/06/02 Python
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript