当前位置:首页 > React

react 如何使用canvas

2026-02-26 05:25:45React

在 React 中使用 Canvas

React 中可以通过 useRefuseEffect 结合原生 Canvas API 实现绘图功能。以下是一个完整的实现方法:

创建 Canvas 组件

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

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

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

    // 绘制矩形
    ctx.fillStyle = 'green';
    ctx.fillRect(10, 10, 150, 100);
  }, []);

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

export default Canvas;

处理动态绘图

对于需要响应状态变化的绘图,可以将状态添加到依赖数组中:

react 如何使用canvas

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(10, 10, 150, 100);
  }, [color]);

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

实现动画效果

使用 requestAnimationFrame 实现动画:

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

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

    let animationId;
    const animate = () => {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      ctx.fillRect(positionRef.current, 50, 50, 50);
      positionRef.current += 1;
      if (positionRef.current < canvas.width) {
        animationId = requestAnimationFrame(animate);
      }
    };

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

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

处理用户交互

添加事件监听器处理用户输入:

react 如何使用canvas

function InteractiveCanvas() {
  const canvasRef = useRef(null);
  const [circles, setCircles] = useState([]);

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

    const handleClick = (e) => {
      const rect = canvas.getBoundingClientRect();
      const x = e.clientX - rect.left;
      const y = e.clientY - rect.top;
      setCircles([...circles, { x, y }]);
    };

    canvas.addEventListener('click', handleClick);
    return () => canvas.removeEventListener('click', handleClick);
  }, [circles]);

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

    ctx.clearRect(0, 0, canvas.width, canvas.height);
    circles.forEach(circle => {
      ctx.beginPath();
      ctx.arc(circle.x, circle.y, 20, 0, 2 * Math.PI);
      ctx.fill();
    });
  }, [circles]);

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

性能优化建议

对于复杂的 Canvas 应用,考虑以下优化方式:

  • 使用 shouldComponentUpdateReact.memo 避免不必要的重渲染
  • 将 Canvas 操作与 React 状态更新分离
  • 对于静态内容,可以考虑离屏 Canvas
  • 使用 useCallback 包装事件处理函数

常用 Canvas 库

如果项目需要更高级的功能,可以考虑这些 React Canvas 库:

  • react-konva
  • react-canvas
  • react-art
  • fabric.js (通过 React 封装使用)

分享给朋友:

相关文章

如何生成react代码

如何生成react代码

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

react如何更新

react如何更新

更新 React 版本的方法 检查当前 React 版本 运行以下命令查看项目中安装的 React 版本: npm list react 更新 React 及相关依赖 通过 npm 或 yarn…

如何开发react

如何开发react

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

react如何使用路由

react如何使用路由

使用 React Router 的基本方法 React Router 是 React 应用中实现路由功能的核心库。以下是基本使用方法: 安装 React Router 依赖包: npm insta…

react项目如何启动

react项目如何启动

启动React项目的步骤 确保已安装Node.js(建议版本12以上)和npm/yarn。可通过以下命令检查版本: node -v npm -v 全局安装create-react-app脚手架工具(…

react如何添加图片

react如何添加图片

在React中添加图片的方法 使用import导入本地图片 将图片文件放在项目目录中(如src/assets),通过import语句引入后作为src属性值: import logo from './…