Echarts Tooltip 如何编写 ReactNode

323 阅读1分钟

项目初始化

最简单的折线图📈

import ReactECharts from "echarts-for-react";
import { FC } from "react";

export const EchartsTooltip: FC = () => {
  return (
    <ReactECharts
      style={{ height: 800, width: '100%' }}
      option={{
        xAxis: {
          type: "category",
          data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
        },
        yAxis: {
          type: "value",
        },
        tooltip: {
          trigger: 'axis'
        },
        series: [
          {
            data: [150, 230, 224, 218, 135, 147, 260],
            type: "line",
          },
        ],
      }}
    />
  );
};

Snipaste_2025-04-18_21-42-21.png

当期望自定义 tooltip 时,Echarts 提供了 tooltip formatter 回调函数。

Echarts tooltip 文档📄

tooltip: {
  trigger: 'axis',
  formatter: (params) => {
    console.log('params', params)
    return params
  }
},

Snipaste_2025-04-18_21-59-34.png

提示框浮层内容格式器,支持字符串模板和回调函数两种形式。

回调函数支持返回 HTML 字符串或者创建的 DOM 实例

(params: Object|Array) => string | HTMLElement | HTMLElement[]

renderToStaticMarkup

链接🔗:renderToStaticMarkup

renderToStaticMarkup 是 React 提供的一个服务端渲染(Server-Side Rendering, SSR)API,属于 react-dom/server 模块。它的主要作用是将 React 元素渲染为静态的 HTML 字符串。

由于输出的是纯 HTML,因此组件中的事件处理器(如 onClick)不会起作用。

基本用法

import React from 'react';
import { renderToStaticMarkup } from 'react-dom/server';

const EmailTemplate = () => (
  <html>
    <body>
      <h1>Hello, world!</h1>
      <p>This is an email template.</p>
    </body>
  </html>
);

const html = renderToStaticMarkup(<EmailTemplate />);
console.log(html);

输出结果:

<html><body><h1>Hello, world!</h1><p>This is an email template.</p></body></html>

输出的 HTML 非常干净,没有任何多余的 React 元数据。

图表使用 renderToStaticMarkup

tooltip: {
  trigger: 'axis',
  formatter: (params) => {
    return renderToStaticMarkup(<h1>23456</h1>)
  }
},

Snipaste_2025-04-18_21-57-10.png

通过 renderToStaticMarkup 可以自定义 tooltip。当然,这个时候 tooltip 前方的圆点已经不存在了。我们也无法将 params.marker 渲染出来,这是一个字符串。

tooltip: {
  trigger: "axis",
  formatter: (params) => {
    return renderToStaticMarkup(
      <div>
        <span
          style={{
            display: "inline-block",
            width: 10,
            height: 10,
            borderRadius: 10,
            backgroundColor:
              params?.[0].marker?.match(/#(?:[0-9a-fA-F]{6})/)?.[0],
          }}
        />
        235
      </div>
    );
  },
},

Snipaste_2025-04-18_22-11-38.png

项目代码地址

Gitee 地址🔗