https://light9639.github.io/React-Draggable-Ts/
โจ React์ react-draggable
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ ํ์ด์ง์
๋๋ค. โจ
- 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
orTypescirpt - SWC
์ ํํ๋ฉด ์์ฑ ์๋ฃ.
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
- CSS ๋์ SCSS๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด SASS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ค.
yarn add sass
- ์ค์น๊ฐ ์๋ฃ๋๋ฉด
.css
๋ฅผ.scss
๋ก ๋ฐ๊ฟ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
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
์ 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%);
}
- ๋ฐ์ค๋ค์ ๋ง์ฐ์ค๋ ์์ผ๋ก ๋๋๊ทธ ํ๋ฉด ํ์ผ์ด ์ด๋ํ๋ฉด์ ๋ฐ์ค์ ์์น๋ฅผ ํ์ํ๋ค.
- ํ๋ก์ ํธ๋ฅผ ์ ๋ถ ์์ฑํ์์ผ๋ฉด
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 ๋ธ๋์น๋ก ๋น๋๋ ํ์ผ์ด ์ ๋ก๋ ๋์ด ๋ฐฐํฌ๊ฐ ์๋ฃ๋๋ค.