Vue传数据到ECharts时,数据响应式更新了,但地图没渲染???

日志狂
• 阅读 2219

说白了还是把自己绕迷了,在这里记录一下,也希望同时能对看到这篇文章的朋友有所帮助,祝大家技术越来越牛批!!!


进入正题

首先是父组件中,数据请求代码(axios的封装文件就不在此赘述了,本文的问题与axios没什么关系)

// 全国各省各市疫情数据请求
this.$axios
  .post("/wapicovid19/all.php", {
    key: "123",
  })
  .then((res) => {
    // console.log(res.data.retdata);
    for (let i = 0, len = res.data.retdata.length; i < len; i++) {
      this.province.push({
        name: res.data.retdata[i].xArea,
        value: res.data.retdata[i].curConfirm,
      });
    }
  })
  // 其实这里最开始我还加了一层then。。。
  // 等待上边返回的数据到位了再重新更新数据(想想刚刚错误的时候,自己真是个**)
  // 其实没必要,Vue的大多数数据都是响应式的
  .catch((err) => console.error(err));

接着是子组件中接收值的代码:

import chinaMap from "../utils/echarts-china";

export default {
  name: "covid-domestic",
  data() {
    return {
      mapName: "",
    };
  },
  props: {
    propProvince: {
      type: Array,
      default: [],
    },
  },
  // 模板渲染完毕先初始化地图
  mounted() {
    this.mapName = new chinaMap(document.getElementById("map"), this.propProvince);
    this.mapName.generateMap();
  },
};

为了能够看懂子组件中的代码,我把封装的echarts文件贴在下边(封装成了一个构造函数的形式):

import echarts from 'echarts'; // echarts是4.9.0版本的
import '../../node_modules/echarts/map/js/china.js';

class chinaMap {
  // dom参数不说了,这个data参数是通过接口数据动态传入的
  constructor(Dom, data) {
    this.option = {
      tooltip: {
        trigger: 'item',
        formatter: '{b}<br/>现有疫情{c}例'
      },
      toolbox: {
        show: true,
        orient: 'vertical',
        left: 'right',
        top: 'center',
        feature: {
          dataView: { readOnly: false },
          restore: {},
          saveAsImage: {}
        }
      },
      visualMap: {
        min: 800,
        max: 50000,
        text: ['High', 'Low'],
        realtime: false,
        calculable: true,
        inRange: {
          color: ['lightskyblue', 'yellow', 'orangered']
        }
      },
      series: [
        {
          name: '中国疫情地图',
          type: 'map',
          mapType: 'china',
          label: {
            show: true
          },
          data: data,
        }
      ]
    }
    this.dom = Dom;
  }
  // 生成地图(初始化 + 配置选项)
  generateMap() {
    echarts.init(this.dom).setOption(this.option);
  }
}

export default chinaMap;

于是乎就出现了下边的一幕(数据的确动态更新了,但是地图仍是白板):
Vue传数据到ECharts时,数据响应式更新了,但地图没渲染???

与此同时我几乎试遍了各种办法(都是绕路而行),什么更新数据啊,async/await啊,等等等等,差点嗓子眼里冒屁。。。

拐点!

然后我就自言自语的在叙述这个逻辑:“嗯...我需要监听一下props的数据更新,嗯...怎么监听...监听...监听,监听!?”
哦草!!!用watch啊,监听数据的变化,被监听的数据更新时就会启动机关!!!
在子组件中加上了监听的代码:

watch: {
  propProvince() {
    this.mapName = new chinaMap(document.getElementById("map"), this.propProvince);
    this.mapName.generateMap();
    this.mapName.eHideLoading();
  },
},

成功了!!!
后来我又加上了加载动画覆盖层,调整了下数据,这个地图就完美了
Vue传数据到ECharts时,数据响应式更新了,但地图没渲染???
Vue传数据到ECharts时,数据响应式更新了,但地图没渲染???

完结撒花!!

还是要多积累经验,有时候学到手里不一定真的是自己的,得碰个壁,然后记忆加深,以后再触碰到这个伤疤时,你一下就能记得当时的痛和解决方案!!!

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
10个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
日志狂
日志狂
Lv1
取酒须勤醉,乡关不可思。
文章
4
粉丝
0
获赞
0