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>
相关推荐
一个不爱写代码的瘦子21 小时前
迭代器和生成器
前端·javascript
拳打南山敬老院21 小时前
漫谈 MCP 构建之概念篇
前端·后端·aigc
前端老鹰21 小时前
HTML <output> 标签:原生表单结果展示容器,自动关联输入值
前端·html
OpenTiny社区21 小时前
OpenTiny NEXT 内核新生:生成式UI × MCP,重塑前端交互新范式!
前端·开源·agent
耶耶耶11121 小时前
web服务代理用它,还不够吗?
前端
Liamhuo1 天前
2.1.7 network-浏览器-前端浏览器数据存储
前端·浏览器
洋葱头_1 天前
vue3项目不支持低版本的android,如何做兼容
前端·vue.js
前端小书生1 天前
React 组件渲染
前端·react.js
奔跑的蜗牛ing1 天前
Vue3 + Element Plus 输入框省略号插件:零侵入式全局解决方案
vue.js·typescript·前端工程化
sjd_积跬步至千里1 天前
CSS实现文字横向无限滚动效果
前端