十四届蓝桥杯省赛Web大学组真题(3)

5. 全球新冠疫情数据统计 (考点 ECharts,axios,数据重复渲染)

https://www.lanqiao.cn/problems/5137/learning/?subject_code=4&group_code=2&match_num=14&match_flow=1&origin=cup

实现目标:

  1. 在组件加载时利用 axios 请求地址为 ./js/covid-data.json (必须使用该路径请求,否则可能会请求不到数据) 文件中的数据。并将所有国家名称在 select 标签下的 option 元素进行渲染(保留默认选项 “Select Country”),效果如下:

    • covid-data.json 数据参数说明
      参数说明类型
      Country国家名称string
      CountryCode国家简称string
      NewConfirmed新增确诊number
      TotalConfirmed累计确诊number
      NewDeaths新增死亡number
      TotalDeaths累计死亡number
  2. 图片描述

  3. 当用户改变 select 筛选器的选择时,根据用户的选择改变页面中展示的国家名以及确诊和死亡人数数据。如果用户没有选择任何国家,则展示默认值 0 和默认标题“请选择国家”。以选择法国为例: 

    图片描述

  4. 页面底部的 ECharts 图表希望显示各个国家的累计确诊人数,请修改 initChart 函数的内容,使得图表 x 轴数据为国家简称,y 轴数据为累计确诊人数,效果如下: 

图片描述

思路:

        首先肯定是要axios请求数据,我们可以直接在mounted中就直接异步请求数据或者是写一个异步函数,在mounted中调用,两者写法上是有一定区别的。

 代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>全球新冠疫情数据统计</title>
    <meta
      name="viewport"
      content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"
    />
    <link rel="stylesheet" type="text/css" href="css/style.css" />
    <script src="js/axios.js"></script>
    <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
    <script
      src="js/echarts.min.js"
      type="text/javascript"
      charset="utf-8"
    ></script>
  </head>

  <body>
    <div id="app">
      <header>
        <div>全球新冠疫情数据统计</div>
      </header>
      <main>
        <!-- TODO: 请修改以下代码实现不同国家的数据展示功能 -->
        <div class="title">
          <h2>{{targetCountry}}</h2>
        </div>
        <div class="boxes">
          <div class="box1">
            <h3>确诊</h3>
            <div class="number">
              <span class="font-bold">新增:</span>
              {{NewConfirmed}}
            </div>
            <div class="number">
              <span class="font-bold">总计:</span>
              {{TotalConfirmed}}
            </div>
          </div>
          <div class="box2">
            <h3>死亡</h3>
            <div class="number">
              <span class="font-bold">新增:</span>
              {{NewDeaths}}
            </div>
            <div class="number">
              <span class="font-bold">总计:</span>
              {{TotalDeaths}}
            </div>
          </div>
        </div>
        <select v-model="targetCountry" @change="changeData">
          <option value="请选择国家">Select Country</option>
          <!-- 请在此渲染所有国家选项 -->
          <option :value="item.Country" v-for="item in data">
            {{item.Country}}
          </option>
        </select>
        <div id="chart" style="width: 100%; height: 50vh"></div>
      </main>
    </div>
  </body>

  <script>
    var vm = new Vue({
      el: "#app",

      data() {
        return {
          data: [],
          targetCountry: "请选择国家",
          NewConfirmed: 0,
          NewDeaths: 0,
          TotalConfirmed: 0,
          TotalDeaths: 0,
        };
      },

      methods: {
        // TODO: 请修改该函数代码实现题目要求
        initChart() {
          // 初始化图表
          this.chart = echarts.init(document.getElementById("chart"));
          this.chartOptions = {
            title: {
              text: "全球感染人数前30国家累计确诊人数统计",
              x: "center",
            },
            tooltip: {
              trigger: "axis",
              axisPointer: {
                type: "shadow",
                label: {
                  show: true,
                },
              },
            },
            // 设置x轴数据
            xAxis: {
              // 这里需要显示国家名称缩写,因为有些国家的全称太长,会导致界面不美观
              data: this.data.map(item => item.CountryCode),
              axisLabel: {
                show: true,
                interval: 0,
              },
            },
            yAxis: {
              type: "value",
              name: "确诊数量",
            },
            // 设置y轴数据
            series: [
              {
                data: this.data.map(item => item.TotalConfirmed),
                type: "bar",
                itemStyle: {
                  normal: {
                    color: "#a90000",
                  },
                },
              },
            ],
          };
          // 调用此方法设置 echarts 数据
          this.chart.setOption(this.chartOptions);
        },


        changeData() {
          let findCountry = this.data.find(
            (item) => item.Country == this.targetCountry
          );
          console.log(findCountry);
          if (!findCountry) {
            this.NewConfirmed = 0;
            this.NewDeaths = 0;
            this.TotalConfirmed = 0;
            this.TotalDeaths = 0;
          } else {
            this.NewConfirmed = findCountry.NewConfirmed;
            this.NewDeaths = findCountry.NewDeaths;
            this.TotalConfirmed = findCountry.TotalConfirmed;
            this.TotalDeaths = findCountry.TotalDeaths;
          }
        },
      },
      // TODO: 请在此添加代码实现组件加载时数据请求的功能
      async mounted() {
        var list = await axios.get("./js/covid-data.json");
        this.data = list.data;
        console.log(this.data);
        this.initChart();
      }, 
    });
  </script>
</html>

        请求数据后,目标三就很简单了,就我这里举例option中遍历数据插值语法就好了,相对比较简单,值得一提的是我上面提的

        如果你这样申请使用axios,由于Vue的生命周期关系,mounted挂载页面的时候,你的异步请求还没有请求到数据,页面就进行渲染,会出现下面这样的情况,表格没有x,y轴。

        而你获取到数据后,ECharts是不会重新给你渲染的,一般这种ECharts数据发生变化,我们可以用深度监听,监听数据变化,或者是直接用计算属性。

        而我今天灵光一闪,出现了一个新的想法,我在mounted里面加了一个计时器,嘶,竟然就成功了时间不要设置那么长哈,不然会判定超时。当然这样写是不好的,做做题目还可以,这样写等于每次运行你都多加了时限,最好的办法还是直接异步mounted中请求数据。

        还有就是,明明我功能都实现了,测试一却不通过,暂时还没解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值