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

react如何查

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

react如何浮动

react如何浮动

使用 CSS 实现浮动 在 React 中实现浮动效果可以通过 CSS 的 float 属性完成。在组件的样式文件或内联样式中直接设置 float: left 或 float: right。…

如何提高react

如何提高react

优化性能 使用React.memo对组件进行记忆化处理,避免不必要的重新渲染。对于类组件,可以使用PureComponent来达到类似效果。 利用useMemo缓存计算结果,避免重复计算。对于函数或…

如何构建react

如何构建react

构建 React 项目的步骤 安装 Node.js 和 npm 确保系统已安装 Node.js(包含 npm)。可通过命令行验证: node -v npm -v 使用 Create React Ap…

react如何debugger

react如何debugger

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

vscode如何配置react

vscode如何配置react

配置 VSCode 进行 React 开发 安装必要插件 ES7+ React/Redux/React-Native snippets:提供 React 代码片段快速生成功能。 Prettier -…