Grafana面板插件使用JsonExplorer报ReactNode类型错误如何解决
问题根因
@grafana/ui 提供的 JsonExplorer 类的 render() 方法返回值是原生 HTMLDivElement DOM对象,不属于React支持的ReactNode类型,直接插入JSX模板既会触发TS类型报错,也无法被React正常渲染。
正确实现方式
通过React ref获取真实DOM容器,在副作用钩子中手动完成原生DOM的挂载,同时做好更新和卸载时的清理逻辑,完整可运行代码如下:
import React, { useRef, useEffect } from 'react'; import { JsonExplorer } from '@grafana/ui'; import { PanelProps } from '@grafana/data'; // 保持你原有面板的Props类型定义即可 interface Props extends PanelProps<{}> {} export const SimplePanel: React.FC<Props> = ({ options, data, width, height }) => { const jsonContainerRef = useRef<HTMLDivElement>(null); const traces = '[{"firstName": "John","lastName": "Doe"},{"firstName": "Mark","lastName": "Spree"}]'; const jsonTraces = JSON.parse(traces); useEffect(() => { if (!jsonContainerRef.current) return; // 清空历史内容避免重复渲染 jsonContainerRef.current.innerHTML = ''; // 初始化JsonExplorer // 参数1:要展示的JSON对象 // 参数2:默认展开层级,传0为默认全部折叠 // 参数3:可选,自定义节点展开配置 const jsonExplorer = new JsonExplorer(jsonTraces, 1, { // 示例:指定key为lastName的节点默认展开 // lastName: true }); const jsonDomNode = jsonExplorer.render(); // 将原生DOM挂载到容器 jsonContainerRef.current.appendChild(jsonDomNode); // 组件卸载/更新前的清理逻辑 return () => { if (jsonContainerRef.current) { jsonContainerRef.current.innerHTML = ''; } }; }, [jsonTraces]); return ( <div ref={jsonContainerRef} style={{ width, height, padding: 16, overflow: 'auto' }} /> ); };
注意事项
- 禁止将
render()返回的原生DOM节点直接放在JSX插值中,React虚拟DOM无法直接接管原生DOM节点的渲染 - 如果JSON数据来自面板查询结果,将对应数据源变量加入
useEffect的依赖数组,即可实现数据更新时JSON树自动重渲染 - 容器建议添加
overflow: auto样式,避免JSON内容过长撑破面板布局
内容的提问来源于stack exchange,提问作者Christian68
相关产品推荐
相关产品推荐

