当前位置:首页 > React

react 如何使用canvas

2026-02-11 19:22:18React

使用 Canvas 在 React 中的方法

通过 useRef 直接操作 Canvas

在 React 中可以通过 useRef 获取 Canvas 的 DOM 节点,直接使用 Canvas API 进行绘制。创建一个组件时,在 useEffect 中处理绘制逻辑以避免重复渲染。

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

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

  useEffect(() => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext('2d');

    // 绘制矩形
    ctx.fillStyle = 'blue';
    ctx.fillRect(10, 10, 100, 100);
  }, []);

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

封装 Canvas 为自定义 Hook

将 Canvas 操作封装为自定义 Hook 以便复用。例如创建一个 useCanvas Hook 处理初始化和绘制逻辑。

react 如何使用canvas

function useCanvas(draw) {
  const canvasRef = useRef(null);

  useEffect(() => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext('2d');
    draw(ctx);
  }, [draw]);

  return canvasRef;
}

function CanvasComponent() {
  const draw = (ctx) => {
    ctx.fillStyle = 'red';
    ctx.fillRect(50, 50, 150, 150);
  };
  const canvasRef = useCanvas(draw);

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

动态响应数据变化

通过依赖数组动态更新 Canvas 内容。当传入的数据变化时,触发 useEffect 重新绘制。

react 如何使用canvas

function DynamicCanvas({ color, size }) {
  const canvasRef = useRef(null);

  useEffect(() => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.fillStyle = color;
    ctx.fillRect(10, 10, size, size);
  }, [color, size]);

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

使用第三方库(如 react-konva)

对于复杂场景(如图层管理、事件处理),可以使用专门为 React 优化的库如 react-konva

import { Stage, Layer, Rect } from 'react-konva';

function KonvaExample() {
  return (
    <Stage width={300} height={300}>
      <Layer>
        <Rect x={20} y={20} width={100} height={100} fill="green" />
      </Layer>
    </Stage>
  );
}

性能优化建议

避免在每次渲染时重新创建绘制函数,使用 useCallback 缓存函数。对于频繁更新的动画,使用 requestAnimationFrame 控制渲染周期。

function AnimatedCanvas() {
  const canvasRef = useRef(null);
  const frameRef = useRef(0);

  const animate = useCallback(() => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    // 更新动画逻辑
    frameRef.current = requestAnimationFrame(animate);
  }, []);

  useEffect(() => {
    frameRef.current = requestAnimationFrame(animate);
    return () => cancelAnimationFrame(frameRef.current);
  }, [animate]);

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

注意事项

  • 直接操作 Canvas 时需手动处理清理逻辑(如 clearRect)。
  • 在高分辨率屏幕上,通过设置 canvas.widthstyle.width 避免图像模糊。
  • 事件监听需通过 React 合成事件系统或直接绑定到 Canvas 节点。

分享给朋友:

相关文章

react如何查

react如何查

React 查询方法 React 提供了多种查询 DOM 元素的方式,以下是几种常见的方法: 使用 ref 通过 useRef 钩子可以获取 DOM 节点的引用,适用于直接操作 DOM 的场景。…

react如何debugger

react如何debugger

调试 React 应用的方法 使用浏览器开发者工具进行调试 React 开发者工具(React DevTools)是调试 React 应用的必备工具。安装 Chrome 或 Firefox 扩展后,可…

如何恢复react

如何恢复react

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

react如何添加图片

react如何添加图片

在React中添加图片的方法 使用import导入本地图片 将图片文件放在项目目录中(如src/assets),通过import语句引入后作为src属性值: import logo from './…

react如何上传文件

react如何上传文件

使用React上传文件的方法 使用HTML的input元素和FormData 创建一个文件输入字段,通过onChange事件获取文件对象,使用FormData将文件数据发送到服务器。 import…

react如何修改值

react如何修改值

修改 React 组件的值 在 React 中修改值通常涉及状态管理。根据组件的类型(类组件或函数组件)和状态管理方式(本地状态或全局状态),方法有所不同。 使用 useState(函数组件) 在函…