当前位置:首页 > 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

如何学react

学习 React 的基础知识 React 是一个用于构建用户界面的 JavaScript 库。学习 React 的第一步是掌握其核心概念,包括组件、状态(State)、属性(Props)和生命周期方法…

react native如何启动

react native如何启动

如何启动 React Native 项目 安装 Node.js 和 npm 确保已安装 Node.js(建议版本 16 或更高)和 npm(Node.js 自带)。可通过以下命令检查版本: node…

如何评价react native

如何评价react native

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

react 如何执行

react 如何执行

安装 Node.js 和 npm React 开发需要 Node.js 环境,因为它提供了 npm(或 yarn)包管理工具。从 Node.js 官网 下载并安装最新 LTS 版本。安装完成后,在终端…

如何生成react代码

如何生成react代码

使用 Create React App 生成项目 安装 Node.js 后,通过命令行工具运行以下命令创建新项目: npx create-react-app my-app cd my-app npm…

电脑如何安装react

电脑如何安装react

安装 Node.js 和 npm React 依赖于 Node.js 和 npm(Node Package Manager)。从 Node.js 官网下载并安装最新稳定版本,安装完成后会自动包含 np…