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>
相关推荐
腾讯TNTWeb前端团队3 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰6 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪7 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪7 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy7 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom8 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom8 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom8 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom8 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom8 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试