vueadminpro+vue2+eacharts el-tabs获取后端数据显示饼图并且是父子组件的方式2.0-饼图在一个页面分区域显示

我是引入了两个图表组件,大体和非2.0版本差不多,结论:根据变量显示图表数据,子组件2(1和2一样就是保存数据字段不一样以及多了图表居中)

看代码-父组件

html 复制代码
<el-tab-pane label="饼状图" name="second">
        <el-row :gutter="1">
          <el-col :span="12">
            <vab-chart-pie title="来源渠道饼状图" :pieData="pieData" v-if="chartDataIsReady" :titleTab="tabName" />
          </el-col>
          <el-col :span="12">
            <vab-chart-ses title="会话次数饼状图" :sessionPieData="sessionPieData" v-if="chartDataIsReady" :titleTab="tabName" />
          </el-col>
        </el-row>
      </el-tab-pane>

import VabChartPie from '../compoents/VabChartPie.vue'
  import VabChartSes from '../compoents/VabChartSes.vue'
  export default {
    name: 'InlineEditTable',
    components: {
      selects,
      VabChartPie,
      VabChartSes
    },

data() {
      return {
        activeName: 'first',
        tabName: '', //子组件需监听切换
        chartDataIsReady: false, //确保有数据时渲染dom
  pieData: {
          //子组件中需要用到的数组
          lineData: [],
          SearData: [],
        },
        sessionPieData: {
          //子组件2中需要用到的数组
          lineData: [],
          SearData: [],
        },
async mounted() {
      await this.fetchDataPie()
    },

 //获取饼图数据
      fetchDataPie() {
        getListPieSource().then((res) => {
          // 将对象转换为数组对象
          const arr = Object.keys(res).map(key => ({
            name: key,
            value: res[key]
          }));
          this.pieData.SearData = arr
          // 使用 Object.keys() 方法获取对象的键
          this.pieData.lineData = Object.keys(res);
          this.tabName = "second"
          // console.log('父1---',this.pieData)
        })
        getListPieCount().then((res) => {
          // 将对象转换为数组对象
          const arr = Object.keys(res).map(key => ({
            name: key,
            value: res[key]
          }));
          this.sessionPieData.SearData = arr
          this.sessionPieData.lineData = Object.keys(res);
          this.tabName = "third"
          // console.log('父2---',this.sessionPieData)
        })
        this.chartDataIsReady = true;
      },

子组件1

html 复制代码
<template>
  <!-- <el-col :lg="8" :md="12" :sm="24" :xl="6" :xs="24"> -->
  <!-- <el-col :span="12"> -->
    <el-card shadow="hover">
      <template #header>
        <span>{{ title }}</span>
      </template>
      <vab-chart ref="pieChart" theme="vab-echarts-theme" :init-options="initOptions" :option="option" />
    </el-card>
  <!-- </el-col> -->
</template>

<script>
  import VabChart from '@/extra/VabChart'
  // import Echarts from 'echarts';

  export default {
    name: 'VabChartPie',
    components: {
      VabChart,
    },
    props: {
      titleTab: {
        type: String,
        default: '',
      },
      title: {
        type: String,
        default: '',
      },
      pieData: {
        type: Object,
        // required: true, // 这个prop是必须的
        // default: () => ({}) // 提供一个默认值,如果父组件没有传递Data
      },
      // sessionPieData: {
      //   type: Object,
      // },
    },
    data() {
      return {
        newData: {},
        initOptions: {
          renderer: 'svg',
        },
        option: {}
      }
    },
    created() {

    },
    mounted() {},
    watch: {
      titleTab(newActiveName) {
        // if (newActiveName === 'third') {
        //   this.newData = this.sessionPieData
        //   this.initPieChart2();
        // } else {
        //   this.newData = this.pieData
        //   this.initPieChart();
        // }
        if(newActiveName==='second'){
          // this.initPieChart2();
          this.initPieChart();
        }
      }
    },
    methods: {
      initPieChart() {
          this.newData = this.pieData
        console.log('子1------');
        console.log(this.pieData);
        this.option = {
          tooltip: {
            trigger: 'item'
          },
          // legend: {
          //   bottom: '20%',
          //   icon: 'circle',
          //   orient: 'vertical',
          //   left: '85%',
          //   textStyle: {
          //     color: '#333',
          //     fontSize: 20
          //   },
          //   data:this.newData.lineData,
          // },
          series: [{
            // name: '访问来源',
            type: 'pie',
            radius: '55%',
            data: this.newData.SearData,
            itemStyle: {
              emphasis: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
              }
            }
          }]
        };
      },
      initPieChart2() {
          this.newData = this.sessionPieData
        console.log('子2------');
        console.log(this.sessionPieData);
        this.option = {
          tooltip: {
            trigger: 'item'
          },
          series: [{
            // name: '访问来源',
            type: 'pie',
            radius: '55%',
            data: this.newData.SearData,
            itemStyle: {
              emphasis: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
              }
            }
          }]
        };
      },
    }
  }
</script>

子组件2(1和2一样就是保存数据字段不一样)

html 复制代码
<template>
    <el-card shadow="hover">
      <template #header>
        <span>{{ title }}</span>
      </template>
      <vab-chart ref="sesChart" theme="vab-echarts-theme" :init-options="initOptions" :option="option" />
    </el-card>
</template>

<script>
  import VabChart from '@/extra/VabChart'

  export default {
    name: 'VabChartSes',
    components: {
      VabChart,
    },
    props: {
      titleTab: {
        type: String,
        default: '',
      },
      title: {
        type: String,
        default: '',
      },
      sessionPieData: {
        type: Object,
      },
    },
    data() {
      return {
        newData: {},
        initOptions: {
          renderer: 'svg',
        },
        option: {}
      }
    },
    created() {

    },
    mounted() {},
    watch: {
      titleTab(newActiveName) {
        if(newActiveName==='third'){
          this.initsesChart();
        }
      }
    },
    methods: {
      initsesChart() {
          this.newData = this.sessionPieData
        console.log('子2------');
        console.log(this.sessionPieData);
        this.option = {
          tooltip: {
            trigger: 'item'
          },
          series: [{
            // name: '访问来源',
            type: 'pie',
            radius: '55%',
            data: this.newData.SearData,
            itemStyle: {
              emphasis: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
              }
            }
          }]
        };
      },
    }
  }
</script>
<style>
/* 可以添加一些额外的样式来确保vab-chart的容器有足够的空间居中 */
.el-card__body {
  width: 100%; /* 或者您想要的特定宽度 */
  height: 100%; /* 或者您想要的特定高度 */
  display: flex;
  justify-content: center;
  align-items: center;
}
</style>
相关推荐
志尊宝6 小时前
Vue3 零基础每日笔记(052):路由常见坑一次排雷——404、刷新丢参数、部署白屏
前端·javascript·vue.js·笔记·html5
linux_cfan6 小时前
videojs v10 源代码系列解读:13 · 能力型媒体契约:`Media` 的组合接口
前端·javascript·音视频
涛涛ing6 小时前
2026年9月,前端圈同时发生了四件事,指向同一个方向
前端
艾伦野鸽ggg7 小时前
Vue2 模板语法与样式绑定
前端
Amos_Web7 小时前
Rspack 源码解析(十一):资产 Hook 与增量构建
前端·rust·源码阅读
PC2005_cloud7 小时前
Windows 数据使用量页面卡死:1097 个热点档案和 161 MB 的 SRUM 库
前端·后端
烈风逍遥7 小时前
AI大模型中fetch 和 ReadableStream为啥一起出现
前端·人工智能
雪芽蓝域zzs7 小时前
第 11 章:封装通用 BaseEchart 基础图表组件(Vue3 + 若依,全局复用)
vue.js·echars
PC2005_cloud7 小时前
Nginx 防盗链配置实战:用 referer 模块保护网站静态资源
前端·后端
福兮说7 小时前
Canvas 文字排版:measureText 量出来的宽度为什么总是不对
前端·javascript