关于 React 如何自定义配置 HighCharts tooltip

前言

当我们结合 React 使用 highCharts 库时,存在一些特殊自定义的情况,比如针对 Tooltip 定制化样式。当然 highCharts 也提供了配置自定义 tooltip 的 formatter 方法,可以支持 html 元素。但是并不够灵活,对于配置复杂样式或组件复用情况下,并不友好。因此寻求新的思路,以下便是社区常用的一个方法,在此记录。

实现

Tooltip 组件封装

import {Chart,TooltipFormatterCallbackFunction,TooltipFormatterContextObject,
} from 'highcharts';
import { useEffect, useRef, useState } from 'react';
import ReactDOM from 'react-dom';const generateTooltipId = (chartId: number) =>`highcharts-custom-tooltip-${chartId}`;interface Props {chart: Chart | null;children(formatterContext: TooltipFormatterContextObject): JSX.Element;
}export const Tooltip = ({ chart, children }: Props) => {const isInit = useRef(false);const [context, setContext] = useState<TooltipFormatterContextObject | null>(null);useEffect(() => {if (chart) {const formatter: TooltipFormatterCallbackFunction = function () {// Ensures that tooltip DOM container is rendered before React portal is created.if (!isInit.current) {isInit.current = true;setTimeout(() => {chart.tooltip.refresh.apply(chart.tooltip, [this.points ? this.points.map(({ point }) => point) : this.point,]);chart.tooltip.hide(0);});}setContext(this);return `<div id="${generateTooltipId(chart.index)}"></div>`;};chart.update({tooltip: {formatter,useHTML: true,},});}}, [chart]);const node = chart && document.getElementById(generateTooltipId(chart.index));return node && context? ReactDOM.createPortal(children(context), node): null;
};

调用方式

import React, { useState, useCallback } from "react";
import Highcharts, { Chart as HighchartsChart } from "highcharts";
import HighchartsReact from "highcharts-react-official";
import { Tooltip } from "./Tooltip";const options = {title: {text: "Custom tooltip as React component"},series: [{type: "line",data: [1, 22424242424, 3, 4, 5, 123123132]}],tooltip: {useHTML: true}
};export const Chart = () => {const [chart, setChart] = useState<HighchartsChart | null>(null);const callback = useCallback((chart: HighchartsChart) => {setChart(chart);}, []);return (<><HighchartsReacthighcharts={Highcharts}options={options}callback={callback}/><Tooltip chart={chart}>{(formatterContext) => {const { x, y } = formatterContext;return (<><div>x: {x}</div><div>y: {y}</div><br /><button onClick={() => alert(`x: ${x}, y: ${y}`)}>Action</button></>);}}</Tooltip></>);
};

formatterContext 里包含以下常用的字段:

{pointspointseriesxy
}

这些字段在自定义 tooltip 组件时可以传参到组件中获取每个 point 的值。
除了 x,y 值外,可以自定义字段,在 series.keys 配置项中,配置如下:

keys: ['x','y','custom.A','custom.B','custom.C',
],
data:[[1, 2, 'A1', 'B1', 'C1'], [1, 2, 'A2', 'B2', 'C2']]

其值便可以在 formatterContext.point.options.custom.AformatterContext.point.options.custom.B 等方式获取。

总结

该实现方式最基本的原理是采用 React 的 createPortal 方法,在指定的元素下渲染子元素。可以理解为类似纯 js 的 getElementById('id').html(children(context))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++(20):bind_front

C(11)&#xff1a;bind_c11 bind_风静如云的博客-CSDN博客 提供了方法来绑定函数参数的方法。 C20提供了bind_front用于简化这个绑定。 #include <iostream> #include <functional> using namespace std;void func1(int d1, int d2) {cout<<__func__<&l…

java元注解

一、注解 Annotation&#xff08;注解&#xff09;是 Java 提供的一种对元程序中元素关联信息和元数据&#xff08;metadata&#xff09;的途径和方法。 Annatation(注解)是一个接口&#xff0c;程序可以通过反射来获取指定程序中元素的 Annotation对象&#xff0c;然后通过该…

Docker下安装Redis

如果我们在Docker上直接拉取redis并运行镜像&#xff0c;当容器删除之后&#xff0c;redis容器里的数据不会被保存&#xff0c;所以我们在运行容器的时候&#xff0c;需要使用数据卷进行挂载&#xff0c;按照如下操作即可。 安装步骤 新建目录/opt/redis [rootlocalhost data…

[山东大学操作系统课程设计]实验2

0.写在前面 其实昨天就把这篇写完了&#xff0c;可是遇到了一些突发事件&#xff0c;暂时还没想好自己的出路在哪&#xff0c;争取这两天把课程设计的实验全都写完吧。。。。。我知道大家现在都很难过&#xff0c;生活上&#xff0c;学业上&#xff0c;事业上。。。。但是还是…

CentOS7根分区扩容之一

Centos默认根分区50G&#xff0c;很快接近100%&#xff0c;如果你的系统使用了全部磁盘&#xff0c;文件系统是xfs&#xff0c;根分区和/home都是逻辑卷&#xff0c;那么在没有额外的磁盘增加情况下&#xff0c;可以从/home卷中切分一部分空间增加到根分区空间。 1.由于xfs格式…

视频合并方法:掌握视频批量嵌套合并技巧,成为剪辑高手

在视频剪辑的过程中&#xff0c;我们经常需要将多个视频片段合并在一起。传统的视频合并方法往往需要大量的时间和精力&#xff0c;通过掌握批量嵌套合并技巧&#xff0c;可以更高效地完成这项任务&#xff0c;成为剪辑高手。本文讲解一种简单易学的视频合并方法&#xff0c;轻…

对于Web标准以及W3C的理解、对viewport的理解、xhtml和html有什么区别?

1、对于Web标准以及W3C的理解 Web标准 Web标准简单来说可以分为结构、表现、行为。 其中结构是由HTML各种标签组成&#xff0c;简单来说就是body里面写入标签是为了页面的结构。 表现指的是CSS层叠样式表&#xff0c;通过CSS可以让我们的页面结构标签更具美感。 行为指的是…

一文看懂自动驾驶传感器区别(摄像头/超声波/毫米波/激光雷达)

传感器摄像头超声波雷达毫米波雷达激光雷达介质可见光和红外光超声波毫米波光波安装位置四周尾部前后保险杠、侧面骨架车顶探测距离&#xff08;取决于镜头和传感器&#xff09;近&#xff08;0.1~3米&#xff09;较远 &#xff08;0~200米&#xff09;远 &#xff08;0~500米&…

关于 ls -s 输出文件大小的单位问题的讨论

自己看书正好看到这里&#xff0c;正纳闷呢&#xff0c;上网查了下&#xff0c;发现不是我自己在为这个问题感到困惑。 有个大哥提出一个问题&#xff1a; 问题标题&#xff1a; ls -s的单位到底是什么&#xff1f; man ls -s, --size print the alloca…

[读论文][跑代码]BK-SDM: A Lightweight, Fast, and Cheap Version of Stable Diffusion

github: GitHub - Nota-NetsPresso/BK-SDM: A Compressed Stable Diffusion for Efficient Text-to-Image Generation [ICCV23 Demo] [ICML23 Workshop] ICML 2023 Workshop on ES-FoMo 简化方式 蒸馏方式&#xff08;训练Task蒸馏outKD-FeatKD&#xff09; 训练数据集 评测指标…

美丽的时钟

案例绘制一个时钟 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>美丽的时钟</title><script language"javascript">window.onloadfunction(){var clockdocument.getElementById("clock"…

【基于Python的快递管理系统的设计与实现】

基于Python的快递管理系统的设计与实现.docx 基于Python的快递管理系统的设计与实现 "Design and Implementation of a Python-based Express Delivery Management System" 目录 目录 2 摘要 3 关键词 4 第一章 绪论 4 1.1 研究背景 4 1.2 研究目的 5 1.3 研究意义 7…

Unity 使用Horizontal Layout Group和Toggle制作多个水平开关按钮实现自动排列和单个点击放大后的自动排列。

Unity的布局组件Horizontal Layout Group是很好用的&#xff0c;当然也包括其它布局组件也一样好用。 比如要实现多按钮开关自动水平排列&#xff0c;那么就可以使用它了。 首先我们为按钮创建个父物体&#xff08;我这里使用了Scroll View中的Content作为父物体&#xff09;…

weblogic任意文件上传漏洞(CVE-2018-2894)

任务一&#xff1a; 复现环境中的漏洞 任务二&#xff1a; 上传webshell或者反弹shell&#xff0c;并执行whoami。 任务一&#xff1a; 1.环境搭建&#xff0c;发现需要密码&#xff0c;所以我们去日志里面查看管理员密码。 2.了解一下这个平台&#xff0c;然后进行一些基本配…

基于Java SSM简单的学籍管理系统

1. 实验选题 《学籍管理系统》。 2. 实验要求和目的 要求:通过分析《学籍管理系统》中的数据模式&#xff0c;建立相应的数据库&#xff0c;并在此数据库中进行建数据表&#xff0c;插入、更新、查询和删除记录操作&#xff0c;最后用可视化编程工具和关系数据库开发一个简单…

基于Python Flask 的全流程全栈项目自己的实战心得

我基于Python Flask框架开发全流程全栈项目的实战经验和心得。我将介绍整个项目的架构设计、前后端交互、数据库管理以及部署等方面&#xff0c;并提供具体的代码示例。通过这个实例项目&#xff0c;你将学习到如何使用Flask构建一个完整的Web应用&#xff0c;并了解一些常见的…

[Ubuntu 18.04] RK3399搭建SSH服务实现远程访问

SSH(Secure Shell)是一种网络协议和软件,用于安全地远程登录到计算机并进行网络服务的加密通信。它提供了加密的认证和安全的数据传输,使得在不安全的网络中进行远程管理和访问变得更加安全。 以下是 SSH 服务的一些关键特点和用途: 安全认证:SSH 使用公钥/私钥加密技术…

实现优雅的自增枚举类:Python中的枚举与自增技巧

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 枚举类型在编程中扮演着重要的角色&#xff0c;它们为变量赋予了更加清晰的含义。然而&#xff0c;在Python中&#xff0c;实现自增的枚举类并非直接而简单的任务。本文将深入讨论如何通过不同的方式优雅地实现自…

Zigbee—基于Z-STACK组网

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;チノカテ—ヨルシカ 0:46━━━━━━️&#x1f49f;──────── 4:08 &#x1f504; ◀️ ⏸ ▶️ ☰ &a…

阿里云配置 HTTPS

一、购买证书 依次点击&#xff1a;数字证书管理服务 -> SSL 证书 -> 免费证书 -> 立即购买 阿里云有免费的 20 个域名的证书&#xff0c;因此就选择这个。 二、创建证书 购买完证书&#xff0c;就可以创建证书&#xff0c;然后填入域名&#xff0c;等待签发。 三…