利用Vue和Echarts实现双层tab嵌套的 柱状图

本文记录了一位开发者在Vue.js中处理父子组件数据传递和事件交互的过程,包括使用v-for指令渲染列表,根据条件显示图标,以及实现tab切换功能。在子组件中,通过点击事件更新数据并初始化图表。博客提到了sessionStorage用于存储和检索数据,以及动态设置图表标题和数据。
摘要由CSDN通过智能技术生成

从接到任务到动手实践,它一直是一个随随便便给我绕懵的存在。谨以此博,记录结果,避免之后再走弯路。若有更好的方法,欢迎交流。
先看实现结果:
在这里插入图片描述
由于4个图布局一模一样,只有数据源不一样,所以我选择在父组件,引入子组件4次,并在父组件获取数据传给子组件,此操作忽略。
下面为子组件的代码:

    <div class="targetcon " v-for="(item, index1) in this.datas" :key="index1">
      <div class="topictitle">
        <span class="iconfont2" v-if="idx == 0">&#xe685;</span>
        <span class="iconfont2" v-if="idx == 1">&#xe77c;</span>
        <span class="iconfont2" v-if="idx == 2">&#xe8ae;</span>
        <span class="iconfont2" v-if="idx == 3">&#xe618;</span>
        {{ item.rootName }} <!--大标题 -->
      </div>
      <ul class="targettab clear">
        <li
          v-for="(item1, index2) in item.result"
          :key="index2"
          :class="{ active: curridx1 == index2 }" <!--tab高亮-->
          @click.stop="tabClick1(item1.categoryName + idx, index2)"   
        > 
          <a>{{ item1.categoryName }}</a>
          <ol class="clear">
            <li
              v-for="(item2, index3) in item1.list"
              :key="index3"
              @click.stop="tabClick2(item2.indexName + idx, index2, index3, item2.indexName)"
              :class="{ active: curridx2 == index3 }"
              class="row-overflow"
              :title="item2.indexName"
            >
              {{ item2.indexName }}
            </li>
          </ol>
        </li>
      </ul>
    </div>

三个方法:

 //tab切换(外层)
    tabClick1(e, tabidx) {
      this.echartsYears = [];
      this.detailData = [];
      this.detailData = JSON.parse(
        window.sessionStorage.getItem(e + tabidx + 0)
      );
      //点击一级tab,二级tab默认获取第一个tab的标题,来源
      this.tempOption.title.text = "各国" + this.datas[0].result[Number(tabidx)].list[0].indexName;
      this.tempOption.title.subtext = "來源:" + this.detailData[0].source
      this.echartsYears = sessionStorage
        .getItem("years" + this.idx + tabidx + 0)
        .split(",")
        .reverse();
      // this.echartsYears = sessionStorage.getItem('years'+idx);
      this.curridx1 = tabidx;
      this.curridx2 = 0;
      this.initEchart(null, null, 1);
    },
   
     //tab切换(里面的)
    tabClick2(e, tabidx, tabidx1, name) {
      this.echartsYears = [];
      this.detailData = [];
      this.curridx2 = tabidx1;
      this.curridx1 = tabidx;
      this.detailData = JSON.parse(
        window.sessionStorage.getItem(e + tabidx + tabidx1)
      );
      //点击二级tab获取对应名称和来源
      this.tempOption.title.text = "各国" + name
      this.tempOption.title.subtext = "來源:" + this.detailData[0].source
      this.echartsYears = sessionStorage
        .getItem("years" + this.idx + tabidx + tabidx1)
        .split(",")
        .reverse();
      this.initEchart(null, null, 2);
    },
     // 初始化柱状图1
    initEchart(datas, idx, tabidx) {
      console.log(datas)
      if (datas && tabidx == undefined) {
        this.echartsYears = datas[0].years.split(",").reverse();
        this.tempOption.xAxis.data = this.echartsYears;
        this.detailData = datas[0].data;
        console.log(this.detailData)
        this.idx = idx;
        this.tempOption.title.text = "各国" + datas[0].indexName
        this.tempOption.title.subtext = "來源:" + datas[0].data[0].source
      }
      let that = this;
      let myChart = this.$echarts.init(this.$refs.targetbar);
      this.tempSeries = [];
      for (let i = 0; i < this.detailData.length; i++) {
        this.tempSeries.push({
          name: this.detailData[i].areaName,
          type: "bar",
          stack: "total",
          barWidth: 30, //柱状图宽度
          data: Object.entries(this.detailData[i]),
          itemStyle: {
            emphasis: {
              // 鼠标移入后的样式
              focus: "series",
            },
          },
        });
      }
      this.tempOption.series = this.tempSeries;
      this.tempOption.xAxis.data = this.echartsYears;
      let legend1 = {
        // data: this.tempOption.series.name,
        left: "center",
        bottom: "10px",
        show: true,
      };
      this.tempOption.legend = legend1;
      myChart.setOption(this.tempOption, true);
   
    },

调用:

mounted() {
    this.$nextTick(() => {
      this.initEchart();
    });
  },

数据格式:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值