在 Vue 项目中使用 ECharts

1. 安装 ECharts

使用 npm 或 yarn 安装 ECharts:

npm install echarts --save
# 或
yarn add echarts

2. 在组件中引入 ECharts

方式一:完整引入(适合快速上手)
import * as echarts from 'echarts';
方式二:按需引入(减少打包体积)
import * as echarts from 'echarts/core';
import { BarChart, LineChart } from 'echarts/charts';
import { GridComponent, TooltipComponent } from 'echarts/components';

// 按需注册组件
echarts.use([BarChart, LineChart, GridComponent, TooltipComponent]);

3. 创建图表容器

在 Vue 模板中添加一个具有明确宽高的容器:

<template>
  <div ref="chartDom" style="width: 600px; height: 400px;"></div>
</template>

4. 初始化图表

mounted 生命周期中初始化图表:

export default {
  data() {
    return {
      chartInstance: null
    };
  },
  mounted() {
    this.initChart();
  },
  methods: {
    initChart() {
      const chartDom = this.$refs.chartDom;
      this.chartInstance = echarts.init(chartDom);
      
      // 配置选项(示例:柱状图)
      const option = {
        xAxis: { data: ['A', 'B', 'C'] },
        yAxis: {},
        series: [{ type: 'bar', data: [10, 20, 30] }]
      };
      
      this.chartInstance.setOption(option);
    }
  }
};

5. 销毁图表

在组件销毁前销毁 ECharts 实例,避免内存泄漏:

beforeDestroy() {
  if (this.chartInstance) {
    this.chartInstance.dispose();
    this.chartInstance = null;
  }
}

6. 响应窗口变化(可选)

监听窗口大小变化并调整图表:

mounted() {
  this.initChart();
  window.addEventListener('resize', this.handleResize);
},
beforeDestroy() {
  window.removeEventListener('resize', this.handleResize);
},
methods: {
  handleResize() {
    if (this.chartInstance) {
      this.chartInstance.resize();
    }
  }
}

7. Vue 3 的注意事项

  • 使用 refonMounted
    import { ref, onMounted, onBeforeUnmount } from 'vue';
    
    export default {
      setup() {
        const chartDom = ref(null);
        let chartInstance = null;
    
        onMounted(() => {
          chartInstance = echarts.init(chartDom.value);
          // 设置配置项...
        });
    
        onBeforeUnmount(() => {
          if (chartInstance) chartInstance.dispose();
        });
    
        return { chartDom };
      }
    };
    

8. 动态更新数据

当数据变化时,调用 setOption 更新图表:

watch: {
  data(newData) {
    if (this.chartInstance) {
      const newOption = { ...this.option, series: [{ data: newData }] };
      this.chartInstance.setOption(newOption);
    }
  }
}

完整示例代码

<template>
  <div ref="chartDom" style="width: 600px; height: 400px;"></div>
</template>

<script>
import * as echarts from 'echarts';

export default {
  data() {
    return {
      chartInstance: null
    };
  },
  mounted() {
    this.initChart();
    window.addEventListener('resize', this.handleResize);
  },
  beforeDestroy() {
    if (this.chartInstance) {
      this.chartInstance.dispose();
    }
    window.removeEventListener('resize', this.handleResize);
  },
  methods: {
    initChart() {
      this.chartInstance = echarts.init(this.$refs.chartDom);
      const option = {
        xAxis: { data: ['A', 'B', 'C'] },
        yAxis: {},
        series: [{ type: 'bar', data: [10, 20, 30] }]
      };
      this.chartInstance.setOption(option);
    },
    handleResize() {
      this.chartInstance?.resize();
    }
  }
};
</script>

常见问题

  • 容器未设置宽高:图表可能不显示,需确保容器有有效尺寸。
  • 按需引入报错:检查是否遗漏了必要的组件注册。
  • SSR 兼容性:在服务端渲染中需避免直接操作 DOM。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

道不尽世间的沧桑

作者想喝瓶哇哈哈,谢谢大佬

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

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

打赏作者

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

抵扣说明:

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

余额充值