Echart饼形图和折线图的循环展示及选择展示

需求:根据不同的入参调同一接口,循环展示一组饼形图或折线图;

主要问题:在于给定的数据格式不符合图表的配置项格式,需要拆分组装数据;首先默认展示几个图表,当选中一个类别,需要展示其中一个的时候,页面中的Dom没有清除,用了clear()无效,于是乎,就在页面中做两个div,一个用于展示选中的某一项,一个用于展示所有图表。

 1 <div v-if="showPie1">
 2               <div id="chart-row" v-for="(item,index) in dataList" :key="index" style="display: flex;justify-content: center;margin-bottom: 40px;width: 80%;margin:0 auto;">
 3                 <div class="left-chart" :id="'left-chart-'+item.id" style="width:500px;height: 400px;margin-bottom:20px;padding-top:10px;border: 1px solid #f0f0f0;">
 4                   <img src="../../assets/timg.jpg" alt="暂无图片" style="width:100px;height:100px;"></div>
 5               
 6               <div class="right-chart" :id="'right-chart-'+item.id" style="width:500px;height: 400px;margin-bottom:20px;padding-top:10px;border: 1px solid #f0f0f0;">
 7                 <img src="../../assets/timg.jpg" alt="暂无图片" style="width:100px;height:100px;"></div>
 8             </div>
 9           </div>
10           <div id="pie" v-if="showPie2">
11             <div id="chart-row" v-for="(item,index) in itemList" :key="index" style="display: flex;justify-content: center;margin-bottom: 40px;width: 80%;margin:0 auto;">
12                 <div class="left-chart" :id="'left-chart-'+item.id" style="width:500px;height: 400px;margin-bottom:20px;padding-top:10px;border: 1px solid #f0f0f0;"><img src="../../assets/timg.jpg" alt="暂无图片" style="width:100px;height:100px;"></div>
13               
14               <div class="right-chart" :id="'right-chart-'+item.id" style="width:500px;height: 400px;margin-bottom:20px;padding-top:10px;border: 1px solid #f0f0f0;"><img src="../../assets/timg.jpg" alt="暂无图片" style="width:100px;height:100px;"></div>
15             </div>
16           </div>

id为chart-row的是选中某一项的dom,id为pie的是默认展示所有图表的dom.

dom的id取名跟绑定图表初始化的dom名一致,且命名是有规律的。

我这里是同时展示两种类型的图表,成功率和明细,使用axios.all()方法将数据同时请求回来,在请求接口时,使用ES7中的async异步执行,保证数据在.all方法中能够全部获取完。

 1 //获取折线图成功失败率接口定义
 2   async getLeftLineData(list){
 3     var data = {}
 4     if(this.filters.invoice){
 5       data = { ticketType: this.filters.invoice}
 6     }else{
 7       data = { ticketType: list.id }
 8     }
 9     return this.$api.report.ocrMonthCount(data)
10   },

获取到的数据在axios.all方法里做处理,其中optionList是存放循环入参信息的;

optionList: [
        //选择
        { value: '', label: "请选择"},
        { value: "001", label: "选择一" },
        { value: "002", label: "选择二" },
        { value: "003", label: "选择三" },
      ],
 1 for(let i = 0; i < optionList.length; i++){
 2       axios.all([this.getLeftLineData(optionList[i]), this.getRightLineData(optionList[i])])
 3       .then(res=>{
 4         let leftData = res[0].data
 5         let rightData = res[1].data
 6         var xAxis = [];
 7         var failTotal = []
 8         var successTotal = []
 9         var successFailurArry = [1, 2]
10         for(var y = 0; y<successFailurArry.length; y++){
11       // 基于准备好的dom,初始化echarts实例,左侧占比
12           var myChart = echarts.init(document.getElementById('left-line-'+optionList[i].id));
13         for (var j = 0; j < leftData.fail.length; j++) {
14           xAxis.push(leftData.fail[j].monthName);
15           failTotal.push(leftData.fail[j].monthTotal);
16         }
17         for (var k = 0; k < leftData.success.length; k++) {
18           successTotal.push(leftData.success[k].monthTotal);
19         }
20         // 绘制图表
21         var seriesOption = {
22             //配置信息
23         }    
24          myChart.setOption(seriesOption, true);
25         }

有时,myChart.clear()无效,可以手动的将上一次定义的值清空。

转载于:https://www.cnblogs.com/lesliejavascript/p/10969141.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了画饼状图折线图,我们可以使用 Vue3 中的一些可视化库,如 Vue-chartjs、Echarts 和 Highcharts。 1. 使用 Vue-chartjs 画饼状图: Vue-chartjs 是一个基于 Chart.js 的 Vue.js 可视化组件库。它可以很容易地为 Vue 应用程序添加各种图表和图形。 首先,我们需要安装 Vue-chartjs: ``` npm install vue-chartjs chart.js ``` 然后,我们可以创建一个继承自 VueChartJs.Pie 类的组件来画饼状图: ```vue <template> <pie-chart :data="chartData" :options="chartOptions"></pie-chart> </template> <script> import { Pie, mixins } from 'vue-chartjs'; export default { extends: Pie, mixins: [mixins.reactiveProp], props: ['chartData', 'chartOptions'], mounted() { this.renderChart(this.chartData, this.chartOptions); } } </script> ``` 在这个组件中,我们使用了 VueChartJs.Pie 类来定义一个继承自 Pie 类的组件。我们还使用了 mixins.reactiveProp 混合,以便我们可以在 prop 中将数据和选项传递给图表组件。最后,我们在 mounted 钩子中调用 renderChart 方法来渲染图表。 接下来,我们可以在父组件中使用这个饼状图组件: ```vue <template> <pie-chart :chart-data="chartData" :chart-options="chartOptions"></pie-chart> </template> <script> import PieChart from './PieChart.vue'; export default { components: { PieChart }, data() { return { chartData: { labels: ['A', 'B', 'C'], datasets: [{ data: [10, 20, 30], backgroundColor: ['#FF6384', '#36A2EB', '#FFCE56'], hoverBackgroundColor: ['#FF6384', '#36A2EB', '#FFCE56'] }] }, chartOptions: { responsive: true, maintainAspectRatio: false } } } } </script> ``` 在这个父组件中,我们将数据和选项作为 prop 传递给饼状图组件。我们还定义了一个 chartData 对象,其中包含了我们要显示的数据和样式。 2. 使用 Echarts 画折线图Echarts 是一个基于 JavaScript 的可视化库,它提供了各种图表和图形,包括折线图、柱状图、饼状图等等。 首先,我们需要安装 Echarts: ``` npm install echarts ``` 然后,我们可以创建一个继承自 ECharts 组件的组件来画折线图: ```vue <template> <div ref="chart" style="height: 300px;"></div> </template> <script> import * as echarts from 'echarts'; export default { props: ['chartData', 'chartOptions'], mounted() { const chart = echarts.init(this.$refs.chart); chart.setOption(this.chartOptions); chart.setOption({ xAxis: { type: 'category', data: this.chartData.labels }, yAxis: { type: 'value' }, series: [ { data: this.chartData.datasets[0].data, type: 'line', symbolSize: 10, lineStyle: { color: '#FF6384' }, itemStyle: { color: '#FF6384' } } ] }); } } </script> ``` 在这个组件中,我们首先在 mounted 钩子中使用 echarts.init 方法创建一个图表实例,并将其绑定到 div 元素上。然后,我们使用 setOption 方法设置图表的选项和数据。我们还将数据和选项作为 prop 传递给组件,并在 setOption 方法中使用它们来配置图表。 接下来,我们可以在父组件中使用这个折线图组件: ```vue <template> <line-chart :chart-data="chartData" :chart-options="chartOptions"></line-chart> </template> <script> import LineChart from './LineChart.vue'; export default { components: { LineChart }, data() { return { chartData: { labels: ['A', 'B', 'C', 'D', 'E', 'F', 'G'], datasets: [{ data: [10, 20, 30, 25, 15, 5, 20], }] }, chartOptions: { responsive: true, maintainAspectRatio: false } } } } </script> ``` 在这个父组件中,我们将数据和选项作为 prop 传递给折线图组件。我们还定义了一个 chartData 对象,其中包含了我们要显示的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值