解决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 相关文章推荐
javascript实现unicode和字符的互相转换
Jul 18 Javascript
深入理解JavaScript 闭包究竟是什么
Apr 12 Javascript
使用window.prompt()实现弹出用户输入的对话框
Apr 13 Javascript
js实现tab切换效果实例
Sep 16 Javascript
分享JS数组求和与求最大值的方法
Aug 11 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
Sep 13 Javascript
浅谈js的异步执行
Oct 18 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
Dec 08 Javascript
微信小程序开发中的疑问解答汇总
Jul 03 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
Aug 09 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
Dec 15 Javascript
微信小程序列表中item左滑删除功能
Nov 07 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代码
2007/03/03 PHP
php下MYSQL limit的优化
2008/01/10 PHP
PDO::query讲解
2019/01/29 PHP
发现的以前不知道的函数
2006/09/19 Javascript
js 加载时自动调整图片大小
2008/05/28 Javascript
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
python版本单链表实现代码
2018/09/28 Python
Python3中exp()函数用法分析
2019/02/19 Python
python实现AES加密解密
2019/03/28 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
详解Django admin高级用法
2019/11/06 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
澳洲CFL商城:CHEMIST FOR LESS(中文)
2021/02/28 全球购物
十八届三中全会报告学习材料
2014/02/17 职场文书
项目合作协议书范本
2014/04/16 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
优秀教师申报材料
2014/12/16 职场文书
银行员工考核评语
2014/12/31 职场文书
幼儿园辞职书
2015/02/26 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书