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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:18:16