Vue项目使用Echarts

项目使用的echarts版本是 4.2.1,element-resize-detector版本是1.2.4

配置属性option是官方示例的“堆叠图”属性

图表组件:

<template>
  <div>
    <div id="chartMain" style="height:380px;width:100%;padding-bottom: 30px;"/>
  </div>
</template>

<script>
  // 按需引入 引入 ECharts 主模块
  import chartResize from "@/modules/supplierMap/views/supplierPortrait/components/chartResize";

  let echarts = require('echarts/lib/echarts')
  // 引入柱状图
  require('echarts/lib/chart/bar')
  // 引入提示框和标题组件
  require('echarts/lib/component/tooltip')
  require('echarts/lib/component/title')
  require('echarts/lib/component/legend')
  export default {
    name: "histogramChart",
    mixins:[chartResize],
    props: {
      // 父组件传递过来的图表数据
      chartData: {
        type: Object,
        required: true
      }
    },
    data() {
      return {
        // Echarts实例
        chart: null,
        chartDom:null
      }
    },
    watch: {
      /* 如果图表数据是后台获取的,监听父组件中的数据变化,重新触发Echarts */
      chartData: {
        deep: true,
        handler(val) {
          this.setOptions(val)
        }
      }
    },
    mounted() {
      /* 图表初始化 */
      this.$nextTick(() => {
        this.initChart()
      })
    },
    beforeDestroy() {
      if (!this.chart) {
        return
      }
      /* 释放图表实例 */
      this.chart.dispose()
      /* dispose 会释放内部占用的一些资源和事件绑定,但是解除实例的引用我们是做不到的,所以需要重新赋值为null */
      this.chart = null
    },
    methods: {
      initChart() {
        this.chartDom = document.getElementById('chartMain');
        this.chart = echarts.init(this.chartDom);
        let option = {
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'shadow'
            }
          },
          legend: {},
          grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            containLabel: true
          },
          xAxis: [
            {
              type: 'category',
              data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
            }
          ],
          yAxis: [
            {
              type: 'value'
            }
          ],
          series: [
            {
              name: 'Direct',
              type: 'bar',
              emphasis: {
                focus: 'series'
              },
              data: [320, 332, 301, 334, 390, 330, 320]
            },
            {
              name: 'Email',
              type: 'bar',
              stack: 'Ad',
              emphasis: {
                focus: 'series'
              },
              data: [120, 132, 101, 134, 90, 230, 210]
            },
            {
              name: 'Union Ads',
              type: 'bar',
              stack: 'Ad',
              emphasis: {
                focus: 'series'
              },
              data: [220, 182, 191, 234, 290, 330, 310]
            },
            {
              name: 'Video Ads',
              type: 'bar',
              stack: 'Ad',
              emphasis: {
                focus: 'series'
              },
              data: [150, 232, 201, 154, 190, 330, 410]
            },
            {
              name: 'Search Engine',
              type: 'bar',
              data: [862, 1018, 964, 1026, 1679, 1600, 1570],
              emphasis: {
                focus: 'series'
              },
              markLine: {
                lineStyle: {
                  type: 'dashed'
                },
                data: [[{ type: 'min' }, { type: 'max' }]]
              }
            },
            {
              name: 'Baidu',
              type: 'bar',
              barWidth: 5,
              stack: 'Search Engine',
              emphasis: {
                focus: 'series'
              },
              data: [620, 732, 701, 734, 1090, 1130, 1120]
            },
            {
              name: 'Google',
              type: 'bar',
              stack: 'Search Engine',
              emphasis: {
                focus: 'series'
              },
              data: [120, 132, 101, 134, 290, 230, 220]
            },
            {
              name: 'Bing',
              type: 'bar',
              stack: 'Search Engine',
              emphasis: {
                focus: 'series'
              },
              data: [60, 72, 71, 74, 190, 130, 110]
            },
            {
              name: 'Others',
              type: 'bar',
              stack: 'Search Engine',
              emphasis: {
                focus: 'series'
              },
              data: [62, 82, 91, 84, 109, 110, 120]
            }
          ]
        };
        this.setOptions(option)
      },
      setOptions(option) {
        this.chart.setOption(option)
      }
    }
  }
</script>

<style scoped>

</style>
chartResize.js让图表根据容器自适应大小
/** @format */

import ResizeListener from 'element-resize-detector';
export default {
    methods: {
        /* 对chart元素尺寸进行监听,当发生变化时同步更新echart视图 */
        chartEleResizeListener() {
            const chartInstance = ResizeListener({
                strategy: 'scroll',
                callOnAdd: true
            });
            chartInstance.listenTo(this.$el, () => {
                if (!this.chart) return;
                this.chart.resize();
            });
        },

        /* 当窗口缩放时,echart动态调整自身大小 */
        windowResizeListener() {
            if (!this.chart) return;
            this.chart.resize();
        }
    },
    mounted() {
        window.addEventListener('resize', this.windowResizeListener);
        this.chartEleResizeListener();
    },
    beforeDestroy() {
        window.removeEventListener('resize', this.windowResizeListener);
    }
}

对了,这次项目使用图表我其实浪费了挺多时间的,之前不知道这个项目用过echarts,自己以前做的vue项目也没用过图表,React项目用过的Bizcharts在vue又用不了,所以就网上搜了一下。有推荐v-charts的,真的看到它就快跑,如果我事先多了解一下,就会发现这个的文档极其“简洁”,示例也很少,像我这种菜鸟是玩不会的。然后就想用echarts,(因为听说过很多次,之前react也想过用,不过那时候觉得Bizcharts使用起来更简单,没记错应该是按照官方文档傻瓜式操作就可以上手了),然后网上也有很多博文讲怎么在vue项目中引入包下载依赖,但是我看到的很多都是echarts和vue-echarts一起使用的!我们项目vue是2.x,echarts是4.2.1,应该是版本很老了吧,按照其他博文的方法下载vue-echarts,就会报各种错,我搞了好久,报错层出不穷,其中一个报错原因,有篇博文说是因为echarts和vue-echarts版本不匹配,echarts版本太低。最后我就放弃了。我一开始以为vue-echarts就是我想用的echarts,但后来发现并不是。所以搞不来那些花里胡哨的就不搞了,咱就用echarts不香吗?反正我觉得echarts好用,官方文档很完备,配置属性一目了然,甚至觉得比Bizcharts还好用,当初用Bizcharts搞好久都没搞明白那些属性。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要在前端引入 ECharts 的库文件,可以通过 CDN 引入,也可以下载到本地引入。然后,你需要在 Vue 组件中引入 ECharts,并在 mounted 钩子函数中初始化图表。 下面是一个简单的示例代码: ```html <template> <div class="chart-container"> <div ref="chart" class="chart"></div> </div> </template> <script> import echarts from 'echarts' export default { name: 'LineChart', data() { return { chartData: { xData: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], yData: [820, 932, 901, 934, 1290, 1330, 1320] } } }, mounted() { const chart = echarts.init(this.$refs.chart) chart.setOption({ xAxis: { type: 'category', data: this.chartData.xData }, yAxis: { type: 'value' }, series: [{ data: this.chartData.yData, type: 'line' }] }) } } </script> <style scoped> .chart-container { width: 100%; height: 300px; } .chart { width: 100%; height: 100%; } </style> ``` 这个示例代码用到了一个 LineChart 组件,其中 data() 函数中定义了图表的数据,mounted 钩子函数中初始化了图表,并设置了 x 轴、y 轴和数据系列。在模板中,我们使用 ref 属性来引用图表容器,然后在 mounted 钩子函数中初始化图表。注意,这里使用了 $refs 对象来获取 DOM 元素。 当你使用这个组件时,只需要将数据传递给它即可: ```html <template> <div> <line-chart :chartData="chartData"></line-chart> </div> </template> <script> import LineChart from './LineChart' export default { name: 'App', data() { return { chartData: { xData: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], yData: [820, 932, 901, 934, 1290, 1330, 1320] } } }, components: { LineChart } } </script> ``` 这样,你就可以在你的 Spring Boot + Vue 项目使用 ECharts 折线图了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值