Skip to content

light9639/React-Draggable-Ts

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

5 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿชœ React-Draggable-Ts ์—ฐ์Šต ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.

:octocat: https://light9639.github.io/React-Draggable-Ts/

light9639 github io_React-Draggable-Ts_

โœจ React์˜ react-draggable ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“  ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค. โœจ

๐ŸŽ‰ React ์ƒ์„ฑ

  • React ์ƒ์„ฑ
npm create-react-app my-app
# or
yarn create react-app my-app
  • vite๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด
npm create vite@latest
# or
yarn create vite
  • ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰ ํ›„ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ ๋งŒ๋“  ํ›„ React ์„ ํƒ, Typescirpt or Typescirpt - SWC ์„ ํƒํ•˜๋ฉด ์ƒ์„ฑ ์™„๋ฃŒ.

๐Ÿ“ vite.config.ts ์ˆ˜์ •.

  • build์‹œ ์ด๋ฏธ์ง€, CSS. js ํŒŒ์ผ์„ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  ๊ฒฝ๋กœ๋ฅผ ./๋กœ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค.
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
import tsconfigPaths from 'vite-tsconfig-paths';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react(), tsconfigPaths()],
  base: process.env.NODE_ENV === 'development' ? '/' : './',
  build: {
    rollupOptions: {
      output: {
        assetFileNames: (assetInfo) => {
          let extType = assetInfo.name.split('.').at(1);
          if (/png|jpe?g|svg|gif|tiff|bmp|ico/i.test(extType)) {
            extType = 'img';
          }
          return `assets/${extType}/[name]-[hash][extname]`;
        },
        chunkFileNames: 'assets/js/[name]-[hash].js',
        entryFileNames: 'assets/js/[name]-[hash].js',
      },
    },
  },
})
  • ์ž‘์„ฑ ์ดํ›„ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๋ถ€๋ถ„๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ„ฐ๋ฏธ๋„์— yarn ๋ช…๋ น์–ด๋กœ vite-tsconfig-paths, @types/nodeํŒŒ์ผ๋“ค์„ ์„ค์น˜ํ•œ๋‹ค.
yarn add vite-tsconfig-paths @types/node

๐Ÿš… SCSS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜.

  • CSS ๋Œ€์‹  SCSS๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด SASS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•œ๋‹ค.
yarn add sass
  • ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด .css๋ฅผ .scss๋กœ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โœ’๏ธ App.tsx, App.scss ์ˆ˜์ • ๋ฐ ์ž‘์„ฑ

โšก App.tsx

  • Draggable, DraggableData ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด React์—์„œ ๋“œ๋ž˜๊ทธ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Opacity ๊ฐ’์„ ์ง€์ •ํ•˜์—ฌ ๋“œ๋ž˜๊ทธ๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ true๊ฐ€ ๋  ์‹œ ํˆฌ๋ช…๋„๊ฐ€ ๋‚ฎ์•„์ง€๋ฉฐ, ๋“œ๋ž˜๊ทธ๋ฅผ ๋ฉˆ์ถฐ์„œ false๊ฐ€ ๋  ๋•Œ์—๋Š” ํˆฌ๋ช…๋„๊ฐ€ 1์ด ๋œ๋‹ค.
  • trackPos ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋“œ๋ž˜๊ทธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ handleStart๋Š” ํด๋ฆญํ•˜์—ฌ ์ด๋™์‹œ ์ด๋™์„ ์‹œ์ผœ์ฃผ๋ฉฐ handleEnd๋Š” ๋” ์ด์ƒ ํด๋ฆญํ•˜์ง€ ์•Š์€ ์ƒํƒœ์ผ ๊ฒฝ์šฐ ์ด๋™์‹œํ‚ค์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
import React, { useState, useRef } from "react";
import reactLogo from './assets/react.svg'
import Draggable, { DraggableData } from "react-draggable";
import './App.scss'

export default function App(): JSX.Element {
  const nodeRef = useRef(null);

  const [position, setPosition] = useState({ x: 0, y: 0 });
  const [position2, setPosition2] = useState({ x: 50, y: 50 });

  const [Opacity, setOpacity] = useState(false);
  const [Opacity2, setOpacity2] = useState(false);

  const trackPos = (data: DraggableData) => {
    setPosition({ x: data.x, y: data.y });
  };

  const trackPos2 = (data: DraggableData) => {
    setPosition2({ x: data.x, y: data.y });
  };

  const handleStart = () => {
    setOpacity(true);
  };
  const handleEnd = () => {
    setOpacity(false);
  };

  const handleStart2 = () => {
    setOpacity2(true);
  };
  const handleEnd2 = () => {
    setOpacity2(false);
  };

  return (
    <div className="App">
      <h1>React-Draggable-Ts</h1>
      <Draggable
        nodeRef={nodeRef}
        onDrag={(e, data) => trackPos(data)}
        onStart={handleStart}
        onStop={handleEnd}
      >
        <div
          ref={nodeRef}
          className="box"
          style={{ opacity: Opacity ? "0.6" : "1" }}
        >
          <div>BOX</div>
          <div>
            x: {position.x.toFixed(0)}, y: {position.y.toFixed(0)}
          </div>
        </div>
      </Draggable>

      <Draggable
        nodeRef={nodeRef}
        onDrag={(e, data) => trackPos2(data)}
        onStart={handleStart2}
        onStop={handleEnd2}
        scale={2}
      >
        <div
          ref={nodeRef}
          className="box box2"
          style={{ opacity: Opacity2 ? "0.6" : "1" }}
        >
          <div>BOX with scale</div>
          <div>
            x: {position2.x.toFixed(0)}, y: {position2.y.toFixed(0)}
          </div>
        </div>
      </Draggable>
    </div>
  )
}

โšก App.scss

  • App.scss์— box ํด๋ž˜์Šค์— ์Šคํƒ€์ผ ์ถ”๊ฐ€.
.box {
  cursor: pointer;
  padding: 2.5rem 0rem;
  border-radius: 5px;
  width: 250px;
  display: flex;
  flex-direction: column;
  margin: 25px auto;
  color: #fff;
  box-shadow: 0 0 15px hsla(0deg, 0%, 0%, 0.5);
  text-shadow: 0 2px 3px hsla(0deg, 0%, 0%, 0.25);
  background-image: linear-gradient(rgb(0, 198, 251, 0.9) 0%, rgb(0, 91, 234, 0.9) 100%);
}

โš—๏ธ ๋ฐ•์Šค๋“ค์„ ๋งˆ์šฐ์Šค๋กœ ์ด๋™์‹œํ‚ค๊ธฐ.

  • ๋ฐ•์Šค๋“ค์„ ๋งˆ์šฐ์Šค๋‚˜ ์†์œผ๋กœ ๋“œ๋ž˜๊ทธ ํ•˜๋ฉด ํŒŒ์ผ์ด ์ด๋™ํ•˜๋ฉด์„œ ๋ฐ•์Šค์˜ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.

light9639 github io_React-Draggable-Ts_ (1)

๐ŸŽ‰ ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ.

  • ํ”„๋กœ์ ํŠธ๋ฅผ ์ „๋ถ€ ์ž‘์„ฑํ•˜์˜€์œผ๋ฉด gh-pages ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋จผ์ € gh-pages๋ฅผ ์„ค์น˜ํ•œ๋‹ค.
yarn add gh-pages
  • ์„ค์น˜ ์ดํ›„ package.json์˜ scripts ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜๊ณ  homepage ๋ถ€๋ถ„์— ๋ฐฐํฌ ๊ฒฝ๋กœ๋ฅผ ์ ์œผ๋ฉด ๋œ๋‹ค.
"scripts": {
  "predeploy": "yarn build",
  "deploy": "gh-pages -d dist"
},
"homepage": "http://light9639.github.io/React-Draggable-Ts",
  • package.json ์ˆ˜์ •์ด ์™„๋ฃŒ๋˜๋ฉด yarn deploy๋ฅผ ์‹คํ–‰ํ•˜๋ฉด gh-pages ๋ธŒ๋žœ์น˜๋กœ ๋นŒ๋“œ๋œ ํŒŒ์ผ์ด ์—…๋กœ๋“œ ๋˜์–ด ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋œ๋‹ค.

About

๐Ÿชœ Rect-Draggable์„ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“  ์—ฐ์Šต ํŽ˜์ด์ง€.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published