You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

求助:鼠标移出时如何隐藏Victory图表的VictoryToolTip标签?

解决Victory图表鼠标移出后Tooltip不隐藏的问题

我之前也碰到过这个问题,VictoryTooltip默认的行为偶尔会出现鼠标移出后仍停留在页面上的情况,不过有两种靠谱的解决方法,你可以根据自己的场景选择:

方法一:手动控制Tooltip的激活状态

这种方法适合需要自定义Tooltip触发逻辑的场景,通过React状态来直接控制Tooltip的显示和隐藏:

  1. 首先在组件中维护一个状态,用来跟踪Tooltip是否激活以及要展示的数据
  2. 给折线图(VictoryLine)配置events属性,监听鼠标的移入、移出和移动事件,更新状态
  3. 将状态绑定到VictoryTooltipactivedata属性上

具体代码示例:

import React, { useState } from 'react';
import { VictoryChart, VictoryLine, VictoryTooltip } from 'victory';

const CustomLineChart = () => {
  // 初始化Tooltip状态:是否激活 + 要展示的数据
  const [tooltipState, setTooltipState] = useState({
    active: false,
    data: null
  });

  // 鼠标移入数据点时激活Tooltip并更新数据
  const handleMouseOver = (evt) => {
    const targetData = evt.target._events[0].data;
    setTooltipState({
      active: true,
      data: targetData
    });
  };

  // 鼠标移出时关闭Tooltip
  const handleMouseOut = () => {
    setTooltipState({
      active: false,
      data: null
    });
  };

  // 鼠标在数据点上移动时更新Tooltip数据(可选)
  const handleMouseMove = (evt) => {
    const targetData = evt.target._events[0].data;
    setTooltipState(prev => ({
      ...prev,
      data: targetData
    }));
  };

  return (
    <VictoryChart>
      <VictoryLine
        data={[
          { x: 1, y: 2 }, { x: 2, y: 3 }, { x: 3, y: 5 }, { x: 4, y: 4 }, { x: 5, y: 7 }
        ]}
        // 配置数据点的事件监听
        events={[
          {
            target: "data", // 针对数据元素绑定事件
            eventHandlers: {
              onMouseOver: () => handleMouseOver,
              onMouseOut: () => handleMouseOut,
              onMouseMove: () => handleMouseMove
            }
          }
        ]}
      />
      {/* 根据状态控制Tooltip显示 */}
      <VictoryTooltip
        active={tooltipState.active}
        data={tooltipState.data}
        flyoutStyle={{ fill: "#fff", stroke: "#333" }}
        style={{ fontSize: 12 }}
      />
    </VictoryChart>
  );
};

export default CustomLineChart;

方法二:使用VictoryVoronoiContainer自动管理Tooltip

如果你不需要太复杂的自定义逻辑,Victory提供的VictoryVoronoiContainer可以自动帮你处理Tooltip的显示和隐藏,它会在鼠标靠近数据点时触发Tooltip,鼠标移出区域时自动隐藏,非常省心:

import React from 'react';
import { VictoryChart, VictoryLine, VictoryTooltip, VictoryVoronoiContainer } from 'victory';

const AutoTooltipChart = () => {
  return (
    <VictoryChart
      // 替换默认的容器为VictoryVoronoiContainer
      containerComponent={
        <VictoryVoronoiContainer
          // 自定义Tooltip显示的内容
          labels={({ datum }) => `x: ${datum.x}, y: ${datum.y}`}
          // 指定使用VictoryTooltip作为标签组件
          labelComponent={<VictoryTooltip flyoutStyle={{ fill: "#fff" }} />}
        />
      }
    >
      <VictoryLine
        data={[
          { x: 1, y: 2 }, { x: 2, y: 3 }, { x: 3, y: 5 }, { x: 4, y: 4 }, { x: 5, y: 7 }
        ]}
      />
    </VictoryChart>
  );
};

export default AutoTooltipChart;

一些注意事项:

  • 如果你用方法一,要确保eventstarget设置为"data",这样事件才会绑定到折线的每个数据点上
  • 方法二中的VictoryVoronoiContainer会自动计算鼠标与数据点的距离,触发Tooltip的范围可以通过radius属性调整
  • 两种方法都可以通过VictoryTooltipflyoutStylestyle等属性自定义Tooltip的样式

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

火山引擎 最新活动