You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chart.js 3版本如何向外部自定义tooltip传递自定义数据

Chart.js 3 传递自定义数据到外部Tooltip的实现方法

第一步:定义带自定义字段的数据集

你可以将每个数据项定义为对象结构,除了Chart.js需要的x/y(对应不同图表类型的维度字段)字段外,直接追加你需要的自定义属性,比如商品ID、图片链接、商品名称等:

const chartData = {
  datasets: [{
    label: '商品销量',
    data: [
      // 每个数据项自带自定义字段
      { x: '2024-01', y: 120, productId: 1001, productName: '无线耳机', imgUrl: '本地/线上图片地址', price: 199 },
      { x: '2024-02', y: 180, productId: 1002, productName: '智能手表', imgUrl: '本地/线上图片地址', price: 299 },
      // 其他数据项
    ]
  }]
}

第二步:在外部Tooltip逻辑中读取自定义数据

关闭默认Tooltip启用外部模式后,Tooltip回调参数的tooltip对象中会包含dataPoints数组,每个数据点的raw属性就对应你之前定义的完整数据对象,直接从中取自定义字段即可拼接你需要的HTML样式:

const chartConfig = {
  type: 'bar', // 可替换为你实际使用的图表类型
  data: chartData,
  options: {
    interaction: {
      mode: 'index',
      intersect: false,
    },
    plugins: {
      tooltip: {
        enabled: false, // 关闭默认tooltip
        external: (context) => {
          const tooltip = context.tooltip;
          // 拿到当前 hover 对应的数据点
          const dataPoint = tooltip.dataPoints[0];
          // 直接读取自定义字段
          const customData = dataPoint.raw;
          const { productId, productName, imgUrl, price } = customData;

          // 构建自定义tooltip DOM
          let tooltipEl = document.getElementById('custom-tooltip');
          if (!tooltipEl) {
            tooltipEl = document.createElement('div');
            tooltipEl.id = 'custom-tooltip';
            // 可提前给该元素加CSS样式控制外观、定位层级
            document.body.appendChild(tooltipEl);
          }
          if (tooltip.opacity === 0) {
            tooltipEl.style.opacity = 0;
            return;
          }
          // 插入自定义内容,可完全按照你需要的效果图调整结构
          tooltipEl.innerHTML = `
            <div class="tooltip-title">${productName}</div>
            <img src="${imgUrl}" alt="${productName}" width="80">
            <div class="tooltip-item">售价:¥${price}</div>
            <div class="tooltip-item">当月销量:${dataPoint.parsed.y}</div>
            <div class="tooltip-item">商品ID:${productId}</div>
          `;
          // 定位逻辑可直接复用官方示例的坐标计算规则
          tooltipEl.style.opacity = 1;
          tooltipEl.style.left = `${tooltip.caretX}px`;
          tooltipEl.style.top = `${tooltip.caretY}px`;
        }
      }
    }
  }
}

补充方案

如果你不想修改原图表数据的结构,也可以单独维护一个自定义数据数组,保证数组索引和图表数据索引一一对应,在拿到dataPoint.dataIndex之后,直接取自定义数组对应下标的值即可。

内容的提问来源于stack exchange,提问作者Rodney Hickman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:57:00