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

React Native项目react-three/fiber渲染Canvas报错无效Hook调用如何解决

错误原因

你编写的MyCanvas是类组件(Class Component),而React Hooks(包括useRef、useState以及react-three-fiber提供的useFrame)只能在函数组件的顶层作用域调用,不能在类组件的render方法、类成员方法内部调用,因此触发了非法Hook调用的报错。

解决方法

推荐直接将MyCanvas改为函数组件即可,修改后的代码如下:

// 改为函数组件写法
export const MyCanvas = (props) => {
  // 所有Hook放在函数组件顶层,不要嵌套在其他方法内
  const mesh = useRef()
  const [hovered, setHover] = useState(false)
  const [active, setActive] = useState(false)
  useFrame(() => (mesh.current.rotation.x += 0.01))

  return (
      <Canvas>
        <mesh
          {...props}
          ref={mesh}
          scale={active ? 1.5 : 1}
          onClick={(event) => setActive(!active)}
          onPointerOver={(event) => setHover(true)}
          onPointerOut={(event) => setHover(false)}>
          <boxGeometry args={[1, 2, 3]} />
          <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />
        </mesh>
      </Canvas>
  );
}

如果确实需要保留类组件写法,需要把Hook对应的逻辑全部替换为类组件原生实现:

  • useRef对应类组件的React.createRef()
  • useState对应类组件的this.state和this.setState
  • 注意react-three-fiber的useFrame没有类组件对应的官方API,涉及3D动画的场景建议优先使用函数组件写法,避免额外适配成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:48:04