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

React集成fabric.js无需按钮自动渲染矩形实现问题

实现方案

问题根源

你之前的写法不生效核心是三个点:

  • React的state更新是异步批处理的,在useEffect里调用setCanvas之后,同步代码里拿不到更新后的canvas state值
  • 没必要把画布实例存在state里,fabric的canvas实例是命令式对象,变化不需要触发组件重渲染,用ref存储更合理,也不会有异步取值问题
  • useEffect空依赖数组本身就会在组件挂载、DOM渲染完成后执行,完全对应页面加载完成的时机,不需要额外绑定onload事件。

可直接运行的代码

import { fabric } from 'fabric';
import { useEffect, useRef } from 'react';

const Canvas = () => {
  const canvasRef = useRef(null);
  
  useEffect(() => {
    // 初始化画布
    const canvas = new fabric.Canvas('canvas', {
      height: 800,
      width: 800,
    });
    canvasRef.current = canvas;

    // 画布初始化完成后直接添加矩形,不需要点击触发
    const rect = new fabric.Rect({
      height: 280,
      width: 200,
      fill: 'yellow',
      // 可选:设置偏移让矩形居中显示,默认会贴在画布左上角
      left: 300,
      top: 260
    });
    canvas.add(rect);
    canvas.renderAll();

    // 组件卸载时销毁画布,避免内存泄漏
    return () => {
      canvas.dispose();
    }
  }, []); 
  
  return(
    <div>
     <br/><br/>
     <canvas id="canvas" />
    </div>
  );
}
export default Canvas;

如果你想保留原有state写法

不需要改整体结构,只要在useEffect里初始化完画布立刻调用添加矩形的方法就行,不要等state更新后再拿值:

useEffect(() => {
  const canvasInstance = initCanvas();
  setCanvas(canvasInstance);
  // 直接用刚创建的实例添加矩形,跳过state异步更新的问题
  addRect(canvasInstance);
}, []);

改完页面加载完成就会直接渲染黄色矩形,不需要任何点击操作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:45:47