当前位置:首页 > 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 和工具函数:

react如何引用canvas

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 库:

react如何引用canvas

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);
}, []);

标签: reactcanvas
分享给朋友:

相关文章

react moment如何使用

react moment如何使用

安装 react-moment 通过 npm 或 yarn 安装 react-moment: npm install react-moment 或 yarn add react-moment 基本…

如何手写一个react

如何手写一个react

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

react如何衰减

react如何衰减

React 中的动画衰减效果实现 在 React 中实现衰减效果(如滚动衰减、拖动释放后的惯性滑动)通常需要结合物理动画原理或第三方动画库。以下是几种常见方法: 使用 CSS 动画和 @keyfra…

react如何运行

react如何运行

运行React项目的步骤 安装Node.js 确保系统已安装Node.js(建议版本12以上),可从官网下载并安装。Node.js自带npm包管理器,用于后续依赖安装。 创建React项目 使用官方…

react如何收录

react如何收录

React 收录方法 React 的收录主要涉及搜索引擎优化(SEO)和预渲染技术。由于 React 是单页应用(SPA),默认情况下内容由 JavaScript 动态生成,可能导致搜索引擎爬虫难以收…

如何同步react

如何同步react

同步React组件状态的方法 使用useState和useEffect钩子组合可以同步React组件的状态。useState用于声明状态变量,useEffect用于监听状态变化并执行副作用。 imp…