当前位置:首页 > React

react 如何使用canvas

2026-01-15 10:31:29React

使用 Canvas 在 React 中的方法

基本用法

在 React 中使用 canvas 需要通过 useRefcreateRef 获取 DOM 节点。以下是一个简单的示例:

import React, { 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, 100, 100);
  }, []);

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

export default CanvasComponent;

动态绘制

可以通过事件或状态变化触发 Canvas 的重新绘制。例如,根据鼠标移动绘制路径:

function InteractiveCanvas() {
  const canvasRef = useRef(null);
  const [isDrawing, setIsDrawing] = React.useState(false);

  const startDrawing = (e) => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext('2d');
    ctx.beginPath();
    ctx.moveTo(e.nativeEvent.offsetX, e.nativeEvent.offsetY);
    setIsDrawing(true);
  };

  const draw = (e) => {
    if (!isDrawing) return;
    const canvas = canvasRef.current;
    const ctx = canvas.getContext('2d');
    ctx.lineTo(e.nativeEvent.offsetX, e.nativeEvent.offsetY);
    ctx.stroke();
  };

  const stopDrawing = () => setIsDrawing(false);

  return (
    <canvas
      ref={canvasRef}
      width={500}
      height={500}
      onMouseDown={startDrawing}
      onMouseMove={draw}
      onMouseUp={stopDrawing}
      onMouseLeave={stopDrawing}
    />
  );
}

性能优化

对于复杂的 Canvas 动画或高频更新,建议使用 requestAnimationFrame 实现循环渲染:

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

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

    const animate = () => {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      ctx.fillRect(x, 50, 50, 50);
      x = (x + 1) % canvas.width;
      frameId = requestAnimationFrame(animate);
    };

    animate();
    return () => cancelAnimationFrame(frameId);
  }, []);

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

第三方库集成

如果需要更高级的功能(如图像处理、物理引擎),可以结合第三方库如 fabric.jskonva.js

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

function KonvaCanvas() {
  const containerRef = useRef(null);

  useEffect(() => {
    const stage = new Konva.Stage({
      container: containerRef.current,
      width: 300,
      height: 300,
    });

    const layer = new Konva.Layer();
    const circle = new Konva.Circle({
      x: 150,
      y: 150,
      radius: 50,
      fill: 'green',
    });

    layer.add(circle);
    stage.add(layer);
  }, []);

  return <div ref={containerRef} />;
}

注意事项

  • 避免在每次渲染时重新创建 Canvas 上下文,应通过 useRef 持久化引用。
  • 清理动画循环时(如 requestAnimationFrame),需在 useEffect 的返回函数中取消。
  • 对于响应式布局,监听窗口大小变化并动态调整 Canvas 的 widthheight 属性(而非 CSS 缩放)。

react 如何使用canvas

分享给朋友:

相关文章

react native如何启动

react native如何启动

React Native 启动步骤 确保已安装 Node.js(建议版本 14 或更高)和 npm/yarn。安装完成后,通过命令行工具执行以下操作。 初始化新项目 使用 React Native…

react 如何执行

react 如何执行

安装 React 确保 Node.js 安装在本地环境中。通过以下命令创建新的 React 项目: npx create-react-app my-app 进入项目目录并启动开发服务器:…

react如何测试

react如何测试

React 测试方法 React 应用的测试通常涉及组件测试、集成测试和端到端测试。以下是常用的测试工具和方法: Jest Jest 是 Facebook 开发的 JavaScript 测试框架,…

react如何销毁

react如何销毁

销毁 React 组件 在 React 中,销毁组件通常涉及清理副作用(如事件监听器、定时器或订阅)以防止内存泄漏。以下是实现组件销毁的常见方法: 使用 useEffect 清理副作用 在函数组件…

react native 如何

react native 如何

React Native 开发基础 React Native 是一个用于构建跨平台移动应用的框架,允许开发者使用 JavaScript 和 React 编写代码,同时生成原生 iOS 和 Androi…

如何评价react native

如何评价react native

React Native 的优势 跨平台开发效率高:基于 JavaScript 和 React 语法,可同时开发 iOS 和 Android 应用,减少重复代码量。性能接近原生:通过原生组件渲染,性能…