当前位置:首页 > React

react如何引用canvas

2026-01-15 10:49:17React

使用 ref 直接操作 Canvas

在 React 中通过 useRef 钩子创建引用,绑定到 <canvas> 元素的 ref 属性。组件挂载后可通过 ref.current 获取原生 DOM 节点:

import { useRef, useEffect } from 'react';

function CanvasComponent() {
  const canvasRef = useRef(null);

  useEffect(() => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext('2d');
    // 绘制操作
    ctx.fillStyle = 'red';
    ctx.fillRect(10, 10, 50, 50);
  }, []);

  return <canvas ref={canvasRef} width={200} height={200} />;
}

封装自定义 Hook

将 Canvas 逻辑封装成可复用的 Hook,返回 ref 和工具函数:

function useCanvas() {
  const ref = useRef(null);

  const draw = (callback) => {
    if (ref.current) {
      const ctx = ref.current.getContext('2d');
      callback(ctx);
    }
  };

  return [ref, draw];
}

// 使用示例
function MyComponent() {
  const [canvasRef, draw] = useCanvas();

  useEffect(() => {
    draw((ctx) => {
      ctx.beginPath();
      ctx.arc(50, 50, 30, 0, Math.PI * 2);
      ctx.fill();
    });
  }, []);

  return <canvas ref={canvasRef} />;
}

动态调整 Canvas 尺寸

通过 ResizeObserver 或窗口事件监听实现响应式 Canvas:

useEffect(() => {
  const canvas = canvasRef.current;
  const resize = () => {
    canvas.width = canvas.clientWidth;
    canvas.height = canvas.clientHeight;
  };

  const observer = new ResizeObserver(resize);
  observer.observe(canvas);
  return () => observer.disconnect();
}, []);

第三方库集成

对于复杂场景可使用专门处理 Canvas 的 React 库:

import { Canvas } from '@react-three/fiber'; // 3D 渲染
import { Stage, Layer, Rect } from 'react-konva'; // 2D 图形

// react-konva 示例
function KonvaDemo() {
  return (
    <Stage width={300} height={300}>
      <Layer>
        <Rect x={50} y={50} width={100} height={100} fill="blue" />
      </Layer>
    </Stage>
  );
}

TypeScript 类型定义

为 Canvas 添加类型安全支持:

const canvasRef = useRef<HTMLCanvasElement>(null);

useEffect(() => {
  if (canvasRef.current) {
    const ctx = canvasRef.current.getContext('2d');
    if (ctx) {
      // ctx 自动推断为 CanvasRenderingContext2D
    }
  }
}, []);

性能优化技巧

避免频繁重绘,使用 requestAnimationFrame 实现动画:

function animate() {
  ctx.clearRect(0, 0, width, height);
  // 绘制逻辑
  requestAnimationFrame(animate);
}

useEffect(() => {
  const frameId = requestAnimationFrame(animate);
  return () => cancelAnimationFrame(frameId);
}, []);

react如何引用canvas

标签: reactcanvas
分享给朋友:

相关文章

如何手写一个react

如何手写一个react

手写一个简单的 React 创建一个基础的 React 实现需要理解其核心概念:虚拟 DOM、组件、状态管理和渲染。以下是一个简化版的 React 实现。 创建虚拟 DOM 虚拟 DOM 是真实 D…

react 如何debug

react 如何debug

React 调试方法 使用 React Developer Tools React Developer Tools 是浏览器扩展,支持 Chrome 和 Firefox。安装后,可以在开发者工具中查看…

如何恢复react

如何恢复react

恢复 React 项目的方法 检查并修复依赖项 运行 npm install 或 yarn install 重新安装所有依赖项。如果依赖项损坏或缺失,这将恢复项目所需的库和工具。 恢复删除的文件 如…

react如何扩展

react如何扩展

扩展 React 项目的常用方法 使用高阶组件(HOC) 高阶组件是一种复用组件逻辑的方式。通过包裹组件并注入额外属性或逻辑,可以实现功能扩展。例如,一个日志记录的高阶组件: function…

react如何折叠

react如何折叠

在 React 中实现折叠功能 使用 useState 管理折叠状态 通过 useState 定义一个状态变量来控制折叠面板的显示与隐藏。例如: const [isCollapsed, setIs…

react如何配置

react如何配置

配置React项目的基本步骤 安装Node.js和npm 确保系统已安装Node.js(包含npm)。可通过命令行检查版本: node -v npm -v 创建React项目 使用官方工具Crea…