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

react-three/fiber与drei导致组件不渲染,请求调试帮助

问题描述

使用React 19 + Three.js r19 + @react-three/fiber 9.0.4 + @react-three/drei 10.0.1开发项目,只要不渲染任何@react-three/drei的组件(比如OrbitControls、Stage),Three.js场景就能正常显示;但只要引入并渲染任何drei组件,无论组件是否在同一Canvas内、是否包含网格配置,页面都会变成仅显示背景色的空白状态,控制台无任何报错,代码编译也无异常。

排查与解决方案
  • 版本兼容性校验
    React 19目前为测试版,生态适配尚未完善,当前使用的@react-three/fiber 9.0.4和@react-three/drei 10.0.1可能存在兼容问题。建议降级到React 18.x版本测试。

  • drei组件使用规范检查

    1. 确保所有drei组件都正确包裹在<Canvas>内部,禁止在Canvas外渲染drei的Three.js相关组件;
    2. <Stage>组件会重置场景光照、相机等配置,可能覆盖手动添加的光源导致物体不可见。可暂时移除<Stage>测试,或添加adjustCamera={false}参数避免覆盖原有配置;
    3. 给<OrbitControls>添加makeDefault属性,确保它能正确接管相机控制:<OrbitControls makeDefault />
  • 用Suspense包裹Canvas
    React 19的并发特性可能导致渲染时序问题,用<Suspense>包裹Canvas并添加加载占位符,确保异步资源加载完成后再渲染场景:

    <Suspense fallback={<div>加载中...</div>}>
      <Canvas>
        {/* 场景内容 */}
      </Canvas>
    </Suspense>
    
  • 排查Model组件
    如果<Model>内部使用了drei组件,也会触发问题。可先注释掉<Model />,只保留基础Mesh和drei组件测试,确认问题来源。

调整后的代码示例
import React, { Suspense } from 'react';     
import Button from '../components/Button';
import { Canvas } from '@react-three/fiber';
import { Model } from '../components/Model';
import { OrbitControls } from '@react-three/drei';

const HeroSec = () => {
  const handleClick = () => {}
  return (
   <section className='hero flex flex-col justify-center items-center text-white text-md'>
    <div className='flex flex-col sm:flex-row my-16 justify-center items-center h-full w-[80vw]'>
        <div>
            <h3 className='text-purple-700 text-2xl font-bold py-3'>Hi!</h3>
            <h1 className='text-4xl sm:text-5xl font-semibold py-3'>I AM OSES</h1>
            <p className='py-3'>A Web developer with extensive knowlege in developing full stack web application</p>
            <Button  design={"bg-purple-700 p-1.5 rounded-2xl cursor-pointer"} text={"View Work"}
             handleClick={handleClick}/>
            <Button  design={"bg-purple-700 p-1.5 rounded-2xl cursor-pointer ml-5"} text={"Hire Me"}
             handleClick={handleClick}/>
        </div>
        <div>
          <Suspense fallback={<div>场景加载中...</div>}>
            <Canvas>
              <AmbientLight intensity={1} color="#ffffff"/>
              <DirectionalLight position={[0,0,10]} intensity={1} color="#ffffff"/>
              <OrbitControls makeDefault />
              {/* 先注释Model测试drei组件是否正常 */}
              {/* <Model /> */}
              <Mesh>
                <BoxGeometry args={[2,2,2]} />
                <MeshLambertMaterial color="#ff0357"/>
              </Mesh>
              {/* 暂时移除Stage避免覆盖光照配置 */}
              {/* <Stage /> */}
            </Canvas>
          </Suspense>
        </div>
    </div>
</section>
  )
}

export default HeroSec

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:33:14