📜  如何在 ReactJS 中创建一个绘画应用程序?

📅  最后修改于: 2022-05-13 01:56:50.850000             🧑  作者: Mango

如何在 ReactJS 中创建一个绘画应用程序?

在本文中,我们将构建一个简单的绘图应用程序,让您可以像在 MS-Paint 中一样进行绘图。通过本文,我们将学习如何在 React.js 中实现和使用画布。

我们的应用程序包含两个部分,一个用于绘图,另一个是用户可以自定义画笔颜色、宽度和不透明度的菜单。

先决条件:该项目的先决条件是:

  • 反应
  • 功能组件
  • 反应钩子
  • HTML 画布
  • JavaScript ES6

创建一个 React 应用程序:

  • 第 1 步:通过在终端中键入以下命令来创建一个反应应用程序:
npx create-react-app paint-app
  • 第2步:现在,通过运行以下命令进入项目文件夹,即paint-app:
cd paint-app

项目结构:它看起来像这样:

文件名:App.js在这个文件中,我们将实现画布并使用它。这里我们创建了三个函数:startDrawing()、endDrawing() 和 draw()。主要思想是,每当鼠标按钮按下时,我们执行 startDrawing函数,以便光标知道 x 和 y 坐标(起始坐标),并将 isDrawing 状态切换为 true。现在,每当用户移动鼠标时,我们都会执行 draw函数,该函数将在当前 x 和 y 坐标中绘制一个笔划。如果用户抬起鼠标按钮,我们将执行 endDrawing函数,该函数将关闭笔画路径并同时将 isDrawing 状态切换为 false。现在在App.js组件中写下以下代码。

Javascript
import { useEffect, useRef, useState } from "react";
import Menu from "./components/Menu";
import "./App.css";
  
function App() {
  const canvasRef = useRef(null);
  const ctxRef = useRef(null);
  const [isDrawing, setIsDrawing] = useState(false);
  const [lineWidth, setLineWidth] = useState(5);
  const [lineColor, setLineColor] = useState("black");
  const [lineOpacity, setLineOpacity] = useState(0.1);
  
  // Initialization when the component
  // mounts for the first time
  useEffect(() => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext("2d");
    ctx.lineCap = "round";
    ctx.lineJoin = "round";
    ctx.globalAlpha = lineOpacity;
    ctx.strokeStyle = lineColor;
    ctx.lineWidth = lineWidth;
    ctxRef.current = ctx;
  }, [lineColor, lineOpacity, lineWidth]);
  
  // Function for starting the drawing
  const startDrawing = (e) => {
    ctxRef.current.beginPath();
    ctxRef.current.moveTo(
      e.nativeEvent.offsetX, 
      e.nativeEvent.offsetY
    );
    setIsDrawing(true);
  };
  
  // Function for ending the drawing
  const endDrawing = () => {
    ctxRef.current.closePath();
    setIsDrawing(false);
  };
  
  const draw = (e) => {
    if (!isDrawing) {
      return;
    }
    ctxRef.current.lineTo(
      e.nativeEvent.offsetX, 
      e.nativeEvent.offsetY
    );
      
    ctxRef.current.stroke();
  };
  
  return (
    
      

Paint App

      
                        
    
  ); }    export default App;


Javascript
import React from "react";
import "../App.css";
  
const Menu = ({ setLineColor, setLineWidth, 
setLineOpacity }) => {
  return (
    
              {           setLineColor(e.target.value);         }}       />               {           setLineWidth(e.target.value);         }}       />               {           setLineOpacity(e.target.value / 100);         }}       />     
  ); };    export default Menu;


CSS
@import url(
'https://fonts.googleapis.com/css2?family=Lobster&display=swap');
  
.App {
  width: 100%;
  height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: center;
  background-image: linear-gradient(
    120deg, #fdfbfb 0%, #ebedee 100%);
}
  
h1 {
  font-family: 'Lobster', cursive;
  font-size: 50px;
  color: #4644f0;
}
  
.draw-area {
  width: 1280px;
  height: 720px;
  border: 2px solid #808080;
  position: relative;
  background-color: white;
}
  
.Menu {
  width: 650px;
  height: 50px;
  display: flex;
  justify-content: space-evenly;
  border-radius: 5px;
  align-items: center;
  background-color: #a3a3a32d;
  margin: auto;
  margin-top: 10px;
}


文件名:Menu.js让我们创建一个菜单栏,用户可以在其中自定义画笔颜色、大小和不透明度。首先,在src文件夹下创建文件夹名称components 。然后在 components 文件夹中创建一个文件名Menu.jsx 。我们将在 App.js 文件中导入这个自定义组件。现在在Menu.jsx中写下以下代码

Javascript

import React from "react";
import "../App.css";
  
const Menu = ({ setLineColor, setLineWidth, 
setLineOpacity }) => {
  return (
    
              {           setLineColor(e.target.value);         }}       />               {           setLineWidth(e.target.value);         }}       />               {           setLineOpacity(e.target.value / 100);         }}       />     
  ); };    export default Menu;

文件名:App.css让我们为我们的绘画应用设置样式。

CSS

@import url(
'https://fonts.googleapis.com/css2?family=Lobster&display=swap');
  
.App {
  width: 100%;
  height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: center;
  background-image: linear-gradient(
    120deg, #fdfbfb 0%, #ebedee 100%);
}
  
h1 {
  font-family: 'Lobster', cursive;
  font-size: 50px;
  color: #4644f0;
}
  
.draw-area {
  width: 1280px;
  height: 720px;
  border: 2px solid #808080;
  position: relative;
  background-color: white;
}
  
.Menu {
  width: 650px;
  height: 50px;
  display: flex;
  justify-content: space-evenly;
  border-radius: 5px;
  align-items: center;
  background-color: #a3a3a32d;
  margin: auto;
  margin-top: 10px;
}

运行应用程序的步骤:使用以下命令从项目的根目录运行应用程序。

npm start

输出:现在打开浏览器并转到http://localhost:3000/ ,您将看到以下输出: