vue2使用vue-echarts

1.先安装echarts npm i echarts

2.安装vue-echarts

安装的时候注意下对应的版本

"echarts": "5.5.0", "vue-echarts": "6.7.3",这是我安装的版本

注意事项:

如果安装之后报错:"export 'watchEffect' (imported as 'o') was not found in 'vue-demi'之类的,可能是vue的版本太低了在2.7以下

那么则需要安装依赖npm install @vue/composition-api

再在main.js中引入并注册

import VueCompositionApi from '@vue/composition-api';

Vue.use(VueCompositionApi);

再就是vue-echarts的使用示例

javascript 复制代码
<template>
    <v-chart :option="computedOption" autoresize :style="{ height: chartHeight, width: '100%' }" />
</template>  
  
  <script>
import VChart, { THEME_KEY } from 'vue-echarts'
import { use } from 'echarts/core'
import 'echarts/lib/component/grid'
import { PieChart, BarChart, LineChart } from 'echarts/charts'
import { TitleComponent, TooltipComponent, LegendComponent } from 'echarts/components'
import { CanvasRenderer } from 'echarts/renderers'

// 注册 ECharts 组件
use([TitleComponent, TooltipComponent, LegendComponent, PieChart, BarChart, LineChart, CanvasRenderer])

export default {
  name: '', // 添加组件名称
  components: {
    VChart,
  },
  props: {
    chartHeight: {
      type: String,
      default: '100%',
    },
    // 图表数据
    chartData: {
      type: Array,
      required: false,
      default: () => [],
    },
    seriesData: {
      type: Array,
      required: false,
      default: () => [],
    },
    xData: {
      type: Array,
      default: () => [],
    },
  },
  computed: {
    computedOption() {
      return this.generateOption(this.chartData, this.seriesData)
    },
  },
  methods: {
    generateOption(dataList, seriesData) {
      const legendData = this.seriesData.map((item) => item.name)
      const dataTime = [
        '2023-12',
        '2024-01',
        '2024-02',
        '2024-03',
        '2024-04',
        '2024-05',
        '2024-06',
        '2024-07',
        '2024-08',
        '2024-09',
        '2024-10',
        '2024-11',
        '2024-12',
      ]

      // 生成 series 数据
      const series = seriesData.map((item) => ({
        name: item.name,
        type: 'line',
        tooltip: item.tooltip,
        data: item.data,
        symbol: 'none',
        smooth:true,
        showSymbol: false,
        lineStyle: {
          width: 1.5
        }
      }))

      const option = {
        backgroundColor: '#ffffff', // 设置背景颜色为白色
        grid: {
          top: '10%', // 顶部内边距
          left: '10%', // 左侧内边距
          right: '10%', // 右侧内边距
          bottom: '30%', // 底部内边距
        },
        tooltip: {
          trigger: 'axis',
          // axisPointer: {
          //   type: "cross",
          //   crossStyle: {
          // 	color: "#999",
          //   },
          // },
        },
        legend: {
          data: legendData,
          orient: 'horizontal', //
          bottom: '2%', // 图例放在底部
          left:'10%',
          right:'10%',
          icon: 'rect',
          height:'25%', 
          // type: 'scroll', // 超过宽度可滚动
          // pageIconColor: '#666', // 翻页按钮颜色
          // pageTextStyle: {
          //   color: '#666'
          // },
          itemGap: 15, // 图例项间隔
          lineHeight: 16,   // 行高
          itemWidth: 30, // 图例标记宽度
          itemHeight: 2, // 图例标记高度
          textStyle: {
            fontSize: 12,
            padding: [0, 0, 0, 5] // 调整文字与图例标记间距
          },
          // formatter: function (name) {
          //   // 限制图例文字长度
          //   return name.length > 6 ? name.substring(0, 6) + '...' : name;
          // }
        },
        xAxis: [
          {
            type: 'category',
            data: this.xData,
            axisPointer: {
              type: 'shadow',
            },
            axisTick: {
              show: false,
            },
            lineStyle: {
              type: 'dashed', // 设置为虚线
              color: '#ccc', // 虚线颜色
            },
            splitLine: {
              show: true,
              lineStyle: {
                type: 'dashed', // 设置为虚线
                color: '#ccc', // 虚线颜色
              },
            },
          },
        ],
        yAxis: [
          {
            type: 'value',
            name: '',
            min: 0,
            axisLabel: {
              formatter: '{value} ',
            },
            axisLine: {
              show: true,
            },
            lineStyle: {
              type: 'dashed', // 设置为虚线
              color: '#ccc', // 虚线颜色
              width: 1
            },
            splitLine: {
              show: true,
              lineStyle: {
                type: 'dashed',
                color: '#ccc',
                width: 0.5,
              },
            },
          },
          {
            type: 'value',
            name: '',
            min: 0,
            axisLabel: {
              formatter: '{value} ',
              show: false, // 隐藏右侧的 Y 轴标签
            },
            splitLine: {
              show: true,
              lineStyle: {
                type: 'dashed',
                color: '#ccc',
              },
            },
          },
        ],
        series: series,
      }
      return option
    },
  },
}
</script>  
  
  <style scoped>
.chart-container {
  width: 100%;
}
</style>
相关推荐
Zoey的笔记本11 分钟前
「支持ISO27001的GTD协作平台」数据生命周期管理方案与加密通信协议
java·前端·数据库
北辰alk12 分钟前
Vue 的 nextTick:破解异步更新的玄机
vue.js
北辰alk13 分钟前
Vue 技巧揭秘:一个事件触发多个方法,你竟然还不知道?
vue.js
北辰alk25 分钟前
Vue 中 computed 和 watch 的深度解析:别再用错了!
vue.js
C_心欲无痕1 小时前
Docker 本地部署 CSR 前端项目完整指南
前端·docker·容器
康一夏2 小时前
React面试题,封装useEffect
前端·javascript·react.js
Full Stack Developme2 小时前
Redis 持久化 备份 还原
前端·chrome
猪猪拆迁队2 小时前
2025年终总结-都在喊前端已死,这一年我的焦虑、挣扎与重组:AI 时代如何摆正自己的位置
前端·后端·ai编程
❆VE❆2 小时前
WebSocket与SSE深度对比:技术差异、场景选型及一些疑惑
前端·javascript·网络·websocket·网络协议·sse
ConardLi2 小时前
SFT、RAG 调优效率翻倍!垂直领域大模型评估实战指南
前端·javascript·后端