VUE根据数据变化重新渲染Echarts图表

利用vue watch深度监听实现实时更新,还可以使用v-if控制Boolean值重新渲染,但是体验很差,所以还是推荐使用watch实现重新渲染。

父组件:

<echarts-interval :topTen="this.topTen"></echarts-interval>

父组件传过来的值:

        props: {
            topTen: {
                type: Object
            }
        },

子组件声明变量:

saleIntervalChart: null

初始化图表:

        mounted() {
            this.drawLine();
        },
        drawLine() {
            // 基于准备好的dom,初始化echarts实例
            this.saleIntervalChart = this.$echarts.init(document.getElementById('saleIntervalChart'));
            // 绘制图表
            this.draw();
            //自适应浏览器放大缩小
            window.onresize = function () {
                this.saleIntervalChart.resize();
            }
        }

在echarts中,setOption是渲染图表的操作,所以我们将这个操作封装起来。

draw() {
          this.saleIntervalChart.setOption({
              tooltip: {
                  trigger: 'axis',
                  axisPointer: {
                      type: 'cross',
                      crossStyle: {
                          color: '#999'
                      }
                  }
              },
              toolbox: {
                  feature: {
                      dataView: {
                          show: true, readOnly: false,
                          optionToContent: function (opt) {
                              let axisData = opt.xAxis[0].data; //坐标数据
                              let series = opt.series; //折线图数据
                              let tdHeads = '<td  style="padding: 0 10px"></td>'; //表头
                              let tdBodys = ''; //数据
                              series.forEach(function (item) {
                                  //组装表头
                                  tdHeads += '<td style="padding: 0 10px">' + item.name + '</td>';
                              });
                              let table = '<table border="1" style="margin-left:20px;border-collapse:collapse;font-size:14px;text-align:center"><tbody><tr>' + tdHeads + ' </tr>';
                              for (let i = 0, l = axisData.length; i < l; i++) {
                                  for (let j = 0; j < series.length; j++) {
                                      //组装表数据
                                      tdBodys += '<td>' + series[j].data[i] + '</td>';
                                  }
                                  table += '<tr><td style="padding: 0 10px">' + axisData[i] + '</td>' + tdBodys + '</tr>';
                                  tdBodys = '';
                              }
                              table += '</tbody></table>';
                              return table;
                          }
                      },
                      magicType: {show: true, type: ['bar', 'line']},
                      myTool: {
                          title: '还原',
                          show: true,
                          onclick: () => {
                              this.saleIntervalChart.setOption({
                                  xAxis: [
                                      {
                                          type: 'category',
                                          data: this.topTen.goodsNameList,
                                          boundaryGap: true,
                                          axisPointer: {
                                              type: 'shadow'
                                          }
                                      }
                                  ],
                                  yAxis: [
                                      {
                                          type: 'value',
                                          name: '销售金额/销售单数',
                                          axisLabel: {
                                              formatter: '{value}'
                                          }
                                      },
                                      {
                                          type: 'value',
                                          name: '平均售价',
                                          axisLabel: {
                                              formatter: '{value}'
                                          }
                                      }
                                  ],
                                  series: [
                                      {
                                          name: '销售金额',
                                          type: 'bar',
                                          barMaxWidth: 30,
                                          data: this.topTen.totalSaleAmount,
                                          yAxisIndex: 0
                                      },
                                      {
                                          name: '销售单数',
                                          type: 'bar',
                                          barMaxWidth: 30,
                                          data: this.topTen.totalSaleCount,
                                          yAxisIndex: 0
                                      },
                                      {
                                          name: '平均售价',
                                          type: 'line',
                                          barMaxWidth: 30,
                                          data: this.topTen.averageSalePrice,
                                          yAxisIndex: 1
                                      }
                                  ]
                              })
                          },
                          icon: "path://M197.7088 478.72l39.68-39.168a19.2 19.2 0 1 1 26.9824 27.2896l-73.344 72.448a19.2 19.2 0 0 1-26.9824 0l-75.136-74.24A19.2 19.2 0 1 1 115.8912 437.76l43.0592 42.5472C175.616 300.6464 326.7328 160 510.72 160c195.1232 0 353.28 158.1568 353.28 353.28 0 195.1232-158.1568 353.28-353.28 353.28a352.0512 352.0512 0 0 1-242.0224-95.9232 19.2 19.2 0 1 1 26.2912-27.9808 313.6768 313.6768 0 0 0 215.7312 85.504c173.9008 0 314.88-140.9792 314.88-314.88 0-173.9008-140.9792-314.88-314.88-314.88-162.2272 0-295.808 122.6752-313.0112 280.32z",
                      },
                      saveAsImage: {show: true, name: '销售数量TOP10'}
                  }
              },
              grid: {
                  bottom: '6%'
              },
              legend: {
                  data: ['销售金额', '销售单数', '平均售价']
              },
              xAxis: [
                  {
                      type: 'category',
                      data: this.topTen.goodsNameList,
                      boundaryGap: true,
                      axisPointer: {
                          type: 'shadow'
                      }
                  }
              ],
              yAxis: [
                  {
                      type: 'value',
                      name: '销售金额/销售单数',
                      axisLabel: {
                          formatter: '{value}'
                      }
                  },
                  {
                      type: 'value',
                      name: '平均售价',
                      axisLabel: {
                          formatter: '{value}'
                      }
                  }
              ],
              series: [
                  {
                      name: '销售金额',
                      type: 'bar',
                      barMaxWidth: 30,
                      data: this.topTen.totalSaleAmount,
                      yAxisIndex: 0
                  },
                  {
                      name: '销售单数',
                      type: 'bar',
                      barMaxWidth: 30,
                      data: this.topTen.totalSaleCount,
                      yAxisIndex: 0
                  },
                  {
                      name: '平均售价',
                      type: 'line',
                      barMaxWidth: 30,
                      data: this.topTen.averageSalePrice,
                      yAxisIndex: 1
                  }
              ]
          });
      }

watch深度监听,当父组件数据改变就执行this.draw重新绘制图表。

        watch: {
            topTen: {
                deep: true,
                handler: function () {
                    this.draw()
                }
            }
        }
Vue 中动态渲染 Echarts 饼图可以通过以下步骤实现: 1. 首先,确保你已经安装了 EchartsVue。 ```bash npm install echarts vue-echarts ``` 2. 在你的 Vue 组件中引入所需的库和组件。 ```javascript import * as echarts from 'echarts'; import VueECharts from 'vue-echarts'; ``` 3. 在模板中使用 VueECharts 组件,并绑定必要的属性。 ```html <template> <div> <vue-echarts :options="chartOptions" :theme="chartTheme" :auto-resize="true"></vue-echarts> </div> </template> ``` 4. 在 Vue 组件的数据中定义饼图的数据和配置项。 ```javascript data() { return { chartOptions: { title: { text: '饼图示例', left: 'center' }, series: [ { name: '访问来源', type: 'pie', radius: '50%', data: [ { value: 335, name: '直接访问' }, { value: 310, name: '邮件营销' }, { value: 234, name: '联盟广告' }, { value: 135, name: '视频广告' }, { value: 1548, name: '搜索引擎' } ], emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } } } ] }, chartTheme: 'light' // 可选主题:'light', 'dark' }; } ``` 5. 在 Vue 组件的生命周期钩子中初始化并渲染饼图。 ```javascript mounted() { this.$nextTick(() => { const chart = echarts.init(this.$refs.chart); // 初始化 Echarts 实例 chart.setOption(this.chartOptions); // 设置图表的配置项和数据 }); } ``` 通过以上步骤,你就可以在 Vue 中动态渲染 Echarts 饼图了。你可以根据自己的需求调整饼图的数据和配置项,使其适应你的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

01_Carrortwhisker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值