20210301 13일차 그림판 적용

2021. 3. 1. 18:47·BootCamp_Codestates/Final Project

 

필수 개념 useRef

 

useRef는 우리가 리액트 컴포넌트에서 외부 라이브러리의 인스턴스 또는 DOM 을 특정 값 안에 담을 때 사용합니다.

 

https://velog.io/@edie_ko/React-TypeScript-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EB%B3%80%ED%99%98-%EC%97%90%EB%9F%AC-%EC%84%A0%EB%AC%BC-%EC%84%B8%ED%8A%B8

ref 가 null 일 수도 있는 상황에 해당하여, Generics 를 사용하여 표기했다.

const firstCanvas = useRef<any>(null);

 

추가로 공부해야할 내용(반드시 리뷰 및 내용정리해야 함.)

타입스크립트로 리액트 Hooks 사용하기(useState, useReducer, useRef)

출처: velog.io/@velopert/using-hooks-with-typescript

 

Paint component 코드

 

useRef 를 사용하여 구현했고( 추가적으로 내용정리 필요.)

색 변경 시 hooks 메소드인 usestate 를 이용하여 상태 관리를 한다.

import React, { ReactElement, useRef, useState } from "react";
import styled, { keyframes } from "styled-components";
import CanvasDraw from "react-canvas-draw";

export default function CPaint(): ReactElement {
	const [color, changeColor] = useState("black");
	const firstCanvas = useRef<any>(null);
	const secondCanvas = useRef<any>(null);
	const handleColorClick = (event: any) => {
		const newColor = event.target.style.backgroundColor;
		changeColor(newColor);
	};

	const clear1 = () => {
		firstCanvas.current.clear();
	};
	const undo1 = () => {
		firstCanvas.current.undo();
	};
	const handleSaveClick = () => {
		const data = firstCanvas.current.getSaveData();
		console.log("firstdata", data); // type of data === 'string'
		// secondCanvas.current.loadSaveData(data);
	};
	const clear2 = () => {
		secondCanvas.current.clear();
	};
	const undo2 = () => {
		secondCanvas.current.undo();
	};
	const revise = () => {
		const secondData = secondCanvas.current.getSaveData();
		console.log("SecondData", secondData); // 두번째 캔버스의 모든 데이터.
	};

	return (
		<Main>
			<CanvasDraw
				className="CanvasDraw"
				brushRadius={1}
				brushColor={color}
				catenaryColor="red"
				hideGrid
				ref={firstCanvas}
				style={canvasStyle}
			/>
			{/* <CanvasDraw brushRadius={1} brushColor={color} hideGrid ref={secondCanvas} style={canvasStyle} /> */}
			{/* <PaintColor> */}
			{/* <Paint className="fas fa-brush" /> */}
			<Colors className="colors">
				<Color className="singleColor" onClick={handleColorClick} style={{ backgroundColor: "#2c2c2c" }} />
				<Color className="singleColor" onClick={handleColorClick} style={{ backgroundColor: "white" }} />
				<Color className="singleColor" onClick={handleColorClick} style={{ backgroundColor: "#FF3B30" }} />
				<Color className="singleColor" onClick={handleColorClick} style={{ backgroundColor: "#FF9500" }} />
				<Color className="singleColor" onClick={handleColorClick} style={{ backgroundColor: "#FFCC00" }} />
				<Color className="singleColor" onClick={handleColorClick} style={{ backgroundColor: "#4CD963" }} />
				<Color className="singleColor" onClick={handleColorClick} style={{ backgroundColor: "#5AC8FA" }} />
				<Color className="singleColor" onClick={handleColorClick} style={{ backgroundColor: "#0579FF" }} />
				<Color className="singleColor" onClick={handleColorClick} style={{ backgroundColor: "#5856D6" }} />
			</Colors>
			{/* </PaintColor> */}

			<Buttons>
				<Button onClick={clear1}>새종이</Button>
				<Button onClick={undo1}>마지막지우기</Button>
				<Button onClick={handleSaveClick}>다그렸다버튼</Button>
				{/* <Button onClick={clear2}>newPaper</Button>
				<Button onClick={undo2}>undo</Button>
				<Button onClick={revise}>Save Revision</Button> */}
			</Buttons>
		</Main>
	);
}

스타일 컴포넌트 생략.

 

추가해야할 기능

 

현재 색변경, 그림 지우기, 저장한 내용을 렌더링하는 것까지 구현 및 이해를 했다.

선들이 수많은 점들로 채워져 있는데, 이 모든 좌표 데이터가 스트링 형태로 데이터 베이스에 저장되어야 될 것 같다.

가능한 일인지 좀더 확인이 필요하다.

더하여서, 펜 굵기 변경 및 지우개(굵은) 옵션을 추가해야겠다.

 

 

도움 받은 사이트

react canvas draw

: www.npmjs.com/package/@types/react-canvas-draw, www.npmjs.com/package/react-canvas-draw

노마더코더 그림판 만들기

: www.youtube.com/watch?v=cq-l2zPUVoU&feature=emb_title

타입스크립트로 리액트 Hooks 사용하기(useState, useReducer, useRef)

출처: velog.io/@velopert/using-hooks-with-typescript

 

'BootCamp_Codestates > Final Project' 카테고리의 다른 글

20210304 16일차 회원가입 로직 구현(미완)  (0) 2021.03.04
20210302 - 0303 14,15일차 그림판 PNG 저장 구현  (2) 2021.03.03
20210228 12일차 Sub메뉴바/React 에서 페이지 이동  (0) 2021.03.01
20210227 11일차 재충전  (0) 2021.03.01
20210226 10일차 반응형웹_미디어쿼리  (0) 2021.02.27
'BootCamp_Codestates/Final Project' 카테고리의 다른 글
  • 20210304 16일차 회원가입 로직 구현(미완)
  • 20210302 - 0303 14,15일차 그림판 PNG 저장 구현
  • 20210228 12일차 Sub메뉴바/React 에서 페이지 이동
  • 20210227 11일차 재충전
JTB
JTB
웹/앱 개발 정보를 공유하고 있습니다.
  • JTB
    JTechBlog
    JTB
  • 전체
    오늘
    어제
    • All About Programming;) N
      • Computer Science
        • Terminology and Concepts
        • Network
        • Operating System
        • Database
        • Data Structure
      • Frontend
        • Javascript Essentials
        • Perfomance Optimization
        • JS Patterns
        • Next.js
        • Flutter
      • Backend
        • Node.js
      • DevOps
        • Docker & Kubernetes
      • Coding Test N
        • LeetCode N
        • Programmers
      • Tech Books & Lectures
        • Javascript_Modern JS Deep d..
        • Network_IT 엔지니어를 위한 네트워크 입문
      • Projects
        • PolyLingo_2025
        • Build Your Body_2024
        • JStargram_2021
        • Covid19 Tracker_2021
        • JPortfolio_2021
      • BootCamp_Codestates
        • TIL
        • TILookCloser
        • Pre Tech Blog
        • IM Tech Blog
        • Daily Issues and DeBugging
        • First Project
        • Final Project
        • Sprint Review
        • Good to Know
        • Socrative Review
        • HTML &amp; CSS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 글쓰기
    • 관리
  • 공지사항

  • 인기 글

  • 태그

    polylingo
    이벤트
    Threads and Multithreading
    TCP/IP
    testing
    딥다이브
    DOM
    모던 자바스크립트 Deep Dive
    커리어
    indie hacker
    Operating System
    Network
    Time complexity and Space complexity
    Data Structure
    CPU scheduling algorithm
    leetcode
    structure of os
    자바스크립트
    JavaScript
    스코프
    Shared resources
    VoiceJournal
    자바스크립트 딥다이브
    How memory manage data
    mobile app
    js pattern
    Binary Tree BFS
    need a database
    프론트엔드 성능 최적화 가이드
    database
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
JTB
20210301 13일차 그림판 적용
상단으로

티스토리툴바