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

使用React Sigma布局钩子时触发useSigmaContext上下文错误求助

React Sigma布局钩子触发"No context provided"错误,但useSigmaContext可正常调用

问题详情

使用React Sigma测试circular和forceatlas2布局时,调用useLayoutForceAtlas2()触发以下错误:

Error: No context provided: useSigmaContext() can only be used in a descendant of <SigmaContainer>.

奇怪的是,在布局钩子调用前手动执行useSigmaContext()并未触发任何报错,且代码与官方示例完全一致仍无法运行。

使用依赖版本:

  • Sigma: 3.0.0-beta.18
  • @react-sigma/core / layout-core / layout-forceatlas2: 4.0.2
  • graphology: 0.25.4
  • graphology-layout-forceatlas2: 0.10.1

错误触发于react-sigma源码的useLayoutFactory.ts第33行,核心代码如下:

const GraphWrapper: FC<Props> = ({ concepts }: { concepts: ConceptNode[] }) => {
  useSigmaContext();
  // 错误触发点
  const { assign } = useLayoutForceAtlas2();
  const loadGraph = useLoadGraph();

  useEffect(() => {
    const graph = buildGraph(concepts);
    loadGraph(graph);
    // assign();
  }, [loadGraph, concepts]);

  return null;
};

const NetworkGraph = ({ concepts }: Props) => {
  return (
    <SigmaContainer settings={{ allowInvalidContainer: true }}>
      <GraphWrapper concepts={concepts} />
    </SigmaContainer>
  );
};

解决方案

1. 清理重复依赖,确保上下文一致性

该错误大概率是由于项目中存在重复的@react-sigma/core包,导致布局钩子使用的SigmaContext与SigmaContainer提供的上下文不是同一个实例。解决步骤:

  • 删除node_modules文件夹和package-lock.json(或yarn.lock)
  • 重新执行npm install(或yarn install)
  • 安装完成后,执行npm ls @react-sigma/core检查是否存在多版本依赖,若有则手动指定统一版本。

2. 降级Sigma版本至稳定版

当前使用的Sigma为beta版本(3.0.0-beta.18),可能与@react-sigma 4.0.2存在兼容性问题。尝试降级到Sigma 2.x稳定版,并搭配对应版本的@react-sigma包(如@react-sigma/core 3.x),beta版本的API变动可能未与React绑定层同步适配。

3. 绕过React Sigma钩子,直接使用graphology布局

若上述方案无效,可直接使用graphology原生布局方法替代React Sigma的钩子,避免上下文问题:

import forceAtlas2 from 'graphology-layout-forceatlas2';

const GraphWrapper: FC<Props> = ({ concepts }: { concepts: ConceptNode[] }) => {
  const loadGraph = useLoadGraph();
  const { getGraph } = useSigmaContext();

  useEffect(() => {
    const graph = buildGraph(concepts);
    loadGraph(graph);
    // 手动执行ForceAtlas2布局
    forceAtlas2.assign(graph, {
      iterations: 200,
      settings: {
        gravity: 1,
        scalingRatio: 2
      }
    });
  }, [loadGraph, concepts]);

  return null;
};

4. 排查上下文穿透问题

确认组件未被React Portal等方式挂载到SigmaContainer上下文之外,确保GraphWrapper始终是SigmaContainer的直接或间接子组件,无上下文隔断情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:43:11