解决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代码
Mar 18 Javascript
Javascript 颜色渐变效果的实现代码
Oct 01 Javascript
基于jQuery通过jQuery.form.js插件实现异步上传
Dec 13 Javascript
jQuery插件支持同一页面被多次调用
Feb 14 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
May 09 Javascript
JS仿百度自动下拉框模糊匹配提示
Jul 25 Javascript
微信小程序左滑删除效果的实现代码
Feb 20 Javascript
详解VUE2.X过滤器的使用方法
Jan 11 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
Sep 16 Javascript
使用vuex存储用户信息到localStorage的实例
Nov 11 Javascript
Vue中inheritAttrs的使用实例详解
Dec 31 Vue.js
React + Threejs + Swiper 实现全景图效果的完整代码
Jun 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中利用substr_replace将指定两位置之间的字符替换为*号
2011/01/27 PHP
php中日期加减法运算实现代码
2011/12/08 PHP
深入php var_dump()函数的详解
2013/06/05 PHP
PHP实现一维数组转二维数组的方法
2015/02/25 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
AngularJS ng-bind 指令简单实现
2016/07/30 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
Bootstrap基本组件学习笔记之进度条(15)
2016/12/08 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
pandas 层次化索引的实现方法
2019/07/06 Python
numpy数组广播的机制
2019/07/12 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
阿根廷票务网站:StubHub阿根廷
2018/04/13 全球购物
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
帕克纽约:PARKER NY
2018/12/09 全球购物
团员学习总结的自我评价范文
2013/10/14 职场文书
经济类毕业生求职信
2014/06/26 职场文书
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
汶川大地震感悟
2015/08/10 职场文书
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
java设计模式--七大原则详解
2021/07/21 Java/Android
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技