当前位置:首页 > React

react 如何使用canvas

2026-03-30 22:24:23React

在React中使用Canvas

React中可以通过<canvas>元素实现绘图功能,结合useRefuseEffect进行控制和渲染。

创建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 = 'blue';
    ctx.fillRect(10, 10, 100, 100);
  }, []);

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

处理动态绘图

function DynamicCanvas({ color }) {
  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(50, 50, 200, 200);
  }, [color]);

  return <canvas ref={canvasRef} />;
}

添加交互事件

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

  const handleClick = (e) => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext('2d');
    const rect = canvas.getBoundingClientRect();

    const x = e.clientX - rect.left;
    const y = e.clientY - rect.top;

    ctx.fillStyle = 'red';
    ctx.beginPath();
    ctx.arc(x, y, 10, 0, 2 * Math.PI);
    ctx.fill();
  };

  return <canvas 
    ref={canvasRef}
    onClick={handleClick}
    width={600}
    height={400}
  />;
}

性能优化技巧

对于频繁更新的Canvas,建议使用requestAnimationFrame

function AnimationCanvas() {
  const canvasRef = useRef(null);
  const animationRef = useRef(null);
  const angleRef = useRef(0);

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

    ctx.clearRect(0, 0, canvas.width, canvas.height);

    angleRef.current += 0.05;
    const x = 100 + 50 * Math.cos(angleRef.current);
    const y = 100 + 50 * Math.sin(angleRef.current);

    ctx.fillStyle = 'green';
    ctx.fillRect(x, y, 20, 20);

    animationRef.current = requestAnimationFrame(animate);
  };

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

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

第三方库集成

对于复杂场景可以考虑使用库:

react 如何使用canvas

  1. react-konva:提供声明式Canvas API
  2. fabric.js:功能强大的Canvas库
  3. p5.js:创意编码库的React封装
npm install react-konva konva
import { Stage, Layer, Rect, Circle } from 'react-konva';

function KonvaExample() {
  return (
    <Stage width={500} height={500}>
      <Layer>
        <Rect x={20} y={20} width={100} height={100} fill="red" />
        <Circle x={200} y={100} radius={50} fill="green" />
      </Layer>
    </Stage>
  );
}

分享给朋友:

相关文章

react 如何引入jquery

react 如何引入jquery

引入 jQuery 到 React 项目 在 React 项目中引入 jQuery 可以通过多种方式实现,但需要注意 React 和 jQuery 操作 DOM 的方式可能冲突,因此建议仅在必要时使用…

如何监控react性能

如何监控react性能

使用 React Profiler API React 16.5 及以上版本内置了 Profiler API,可直接测量组件渲染时间。通过 <React.Profiler> 包裹目标组件,…

如何搭建react项目

如何搭建react项目

使用 Create React App 搭建项目 Create React App (CRA) 是官方推荐的快速搭建 React 项目的工具,无需配置构建工具(如 Webpack 或 Babel)。…

如何调试react源码

如何调试react源码

调试React源码的方法 克隆React源码仓库到本地: git clone https://github.com/facebook/react.git cd react 安装依赖并构建开发版本:…

如何外部访问react

如何外部访问react

外部访问 React 应用的方法 配置代理服务器 在开发环境中,可以通过配置代理服务器解决跨域问题。修改 package.json 文件,添加 proxy 字段指向后端 API 地址: "proxy…

如何编译react文件

如何编译react文件

编译 React 文件的方法 使用 Create React App (CRA) Create React App 是官方推荐的快速搭建 React 项目的工具,内置了 Babel 和 Webpack…