当前位置:首页 > React

react 如何使用canvas

2026-01-15 10:31:29React

使用 Canvas 在 React 中的方法

基本用法

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

react 如何使用canvas

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 的重新绘制。例如,根据鼠标移动绘制路径:

react 如何使用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性能如何

react性能如何

React 性能特点 React 通过虚拟 DOM(Virtual DOM)和高效的 diff 算法优化性能。虚拟 DOM 减少了直接操作真实 DOM 的开销,仅在必要时更新变化的部分。React 的…

react如何遍历

react如何遍历

遍历数组或对象的方法 在React中,遍历数组或对象通常用于渲染列表或动态生成内容。以下是几种常见的遍历方法: 使用map遍历数组map是遍历数组并返回新数组的高阶函数,适合渲染列表。…

如何开发react

如何开发react

开发React应用的基本步骤 安装Node.js和npm 确保系统中已安装Node.js(包含npm)。可通过官网下载安装包,安装后验证版本: node -v npm -v 创建React项目…

react如何同步

react如何同步

React 同步状态管理方法 在 React 中实现同步状态管理,可以通过以下多种方式实现: 使用 useState 和 useEffect 钩子 通过 useState 定义状态,使用 useEf…

react如何注销

react如何注销

React 组件的注销方法 在 React 中,组件的注销通常指的是在组件卸载时执行清理操作,例如取消订阅、清除定时器或释放资源。以下是几种常见的方法: 使用 useEffect 钩子的清理函数…

uniapp中如何使用iconfont

uniapp中如何使用iconfont

使用 Iconfont 在 Uniapp 中的步骤 下载 Iconfont 资源 访问 Iconfont 官网,选择需要的图标并添加到项目。下载时选择 Font class 格式,解压后会得到 .tt…