ECharts 简介

交互事件与数据缩放

掌握 ECharts 的事件监听、tooltip 格式化、dataZoom 缩放和 markPoint/markLine 标注。

🎯 引言

好看的图表还要“好用”。学会这篇文章,你能给图表加上点击事件、自定义提示框内容、区域缩放和平均线标注,让用户和图表真正互动起来。


🧱 事件监听 on

ECharts 实例通过 on 方法监听交互事件,以常用的 click 事件为例:

chart.on('click', (params) => {
    console.log(params.name); // 类目名,如 '周一'
    console.log(params.value); // 数值,如 120
    console.log(params.seriesName); // 系列名,如 '销量'
});

params 里常用的字段:

字段含义
name点击位置对应的类目名
value数值
seriesName所属系列名
dataIndex数据在数组中的下标

实际场景举例:点击某根柱子,跳转到对应日期的详情页:

chart.on('click', (params) => {
    router.push(`/detail?day=${params.name}`);
});

✨ 自定义提示框 formatter

tooltip 默认显示“系列名:数值”,想换成自己的话术用 formatter

tooltip: {
    trigger: 'axis',
    formatter: (params) => {
        const item = params[0];
        return `${item.name} 销量:${item.value}`;
    },
},
trigger: 'axis'formatter 收到的 params数组(该刻度下所有系列),trigger: 'item' 时是单个对象。搞混类型是 formatter 失效的常见原因。

🧱 区域缩放 dataZoom

数据点多的时候(比如一整年每天的销量),一屏塞不下,dataZoom 可以让用户拖动、滚轮缩放查看局部:

dataZoom: [
    {
        type: 'slider', // 底部滑块
    },
    {
        type: 'inside', // 图表内滚轮、拖拽
    },
],
  • 'slider':图表下方出现一个可拖动的滑块条。
  • 'inside':鼠标滚轮或触屏手势直接在图表上缩放。

两种可以同时存在,互不冲突。


🧱 标注 markPoint 与 markLine

想让图表自己“说话”,比如标出最大值、画一条平均线,不用手算,ECharts 内置了标注能力:

series: [
    {
        name: '销量',
        type: 'line',
        data: [820, 932, 901, 934, 1290, 1330, 1320],
        markPoint: {
            data: [
                { type: 'max', name: '最大值' },
                { type: 'min', name: '最小值' },
            ],
        },
        markLine: {
            data: [{ type: 'average', name: '平均值' }],
        },
    },
],
  • markPoint:在图上标点,内置 'max''min'
  • markLine:在图上画线,内置 'average',常用于平均线。
标注的价值在于“自动”。数据更新后最大值、平均线会跟着重算,不需要你手动维护位置。

真实渲染效果:最大值、最小值自动标点,平均线自动计算:


🧾 小节总结

  • chart.on('click', fn) 监听交互,params 含 name、value、seriesName 等字段。
  • tooltip.formatter 自定义提示框,注意 axis 触发时参数是数组。
  • dataZoom 实现区域缩放,'slider' 滑块、'inside' 滚轮,可叠加使用。
  • markPoint 标最大、最小值,markLine 画平均线,数据变化自动更新。

❓ 知识问答

Q1:事件回调里的 this 指向什么?

建议统一用箭头函数,避免 this 指向问题。箭头函数里可以正常访问组件作用域的变量。

Q2:formatter 里能写 HTML 吗?

可以,返回的字符串支持简单 HTML 标签和行内样式,比如 <b><br/>,方便排版。

Q3:dataZoom 放在 option 的哪一层?

seriesxAxis 平级,是顶层数组,默认作用于第一条 x 轴。

Q4:markLine 只能画平均值吗?

不是,还支持最大、最小值线,也可以写具体数值 { yAxis: 100 } 画固定线。平均线和最大值线比较常用。


🧪 小练习

给“一周销量”折线图加上交互三件套:

  1. 点击某个数据点时,用 alert 弹出“周X 的销量是 XX”。
  2. 加一条平均值 markLine
  3. 加一个 'slider' 类型的 dataZoom
const chart = echarts.init(chartRef.value);

chart.setOption({
    // 请在这里编写代码(配置部分)
});

// 请在这里编写代码(事件部分)

🎉 恭喜你的图表已经能看又能互动了!下一篇解决真实项目的老大难:数据从接口来、还会不停变化,图表该怎么更新。