react-draggable : https://www.npmjs.com/package/react-draggable
๊ฐ์ฒด๋ฅผ ์์ ๋กญ๊ฒ ๋๋๊ทธํ๋ ๋ชจ์ ์ ์ฐพ๋ค๊ฐ ์ง์ ๊ตฌํ๋ ํด๋ณด์์ง๋ง ๋ ๋ํ๋ ๊ณผ์ ์์ buffer๊ฐ ์๊ธฐ๋๊ฒ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐพ์๋ณด์์ต๋๋ค.
์์ฃผ ์ฝ๊ณ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค.
1. ์ค์น
npm install react-draggable
2. ๋ถ๋ฌ์ค๊ธฐ ๋ฐ ์ ์ฉ
import Draggable from "react-draggable";
export default function App() {
const [position, setPosition] = useState({ x: 0, y: 0 }); // box์ ํฌ์ง์
๊ฐ
// ์
๋ฐ์ดํธ ๋๋ ๊ฐ์ set ํด์ค
const trackPos = (data) => {
setPosition({ x: data.x, y: data.y });
};
return (
<div className="App">
<Draggable onDrag={(e, data) => trackPos(data)} >
<div className="box" >
<div>BOX</div>
<div>x: {position.x.toFixed(0)}, y: {position.y.toFixed(0)}</div>
</div>
</Draggable>
</div>
);
}
// css
.box {
position: absolute;
cursor: move;
color: black;
width: 100px;
border-radius: 5px;
padding: 1em;
margin: auto;
user-select: none;
background: lightgrey;
}
Draggable๋ก ๊ฐ์ผ๋ค ํ์ํ ์ต์ ๊ณผ ํจ์๋ฅผ props์ ์ ๋ฌํฉ๋๋ค.
x, y ์ขํ๋ฅผ toFixed(0) ์ผ๋ก ์์์ ์ ์ ์ธํ ๊ฐ์ ํ์ํฉ๋๋ค.
์ฐธ๊ณ ๋ก ๋ฐ๋์ css์์ absolute๋ฅผ ์ค์ผ ์๋์ด ๋๋๊ฒ์ ์๋๋๋ค.
onDrag ์ด์ธ์ ๋ค์ํ ์ต์ ๊ฐ์ด ์์ต๋๋ค. ( ์๋จ react-draggable ์ฌ์ดํธ์์ ํ์ธ ๊ฐ๋ฅ )
์ ์ฉ์ ๋์์ด ์ ๋๋ก ๋๋๋ผ๋ ์ฝ์์ ์๋ฌ๊ฐ ๋ ์ ์์ต๋๋ค. ๐ฆ
useRef๋ฅผ ํตํด ํด๊ฒฐํ ์ ์์ต๋๋ค. ์์ธํ ์ฌํญ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
3. ๋๋๊ทธ ์ค ํจ๊ณผ์ฃผ๊ธฐ
๋๋๊ทธ์ค onStart์ onStop ์ต์ ์ ํตํด ํจ์๋ฅผ ํธ์ถ ํ ์ ์์ต๋๋ค.
๋๋๊ทธ ์ค opacity๋ฅผ ์ฃผ๋ ํจ๊ณผ๋ฅผ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
{ ... }
const [Opacity, setOpacity] = useState(false);
const handleStart = () => {
setOpacity(true);
};
const handleEnd = () => {
setOpacity(false);
};
{...}
<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>
์ด๋ ๊ฒ onStart์ ํตํด ๋๋๊ทธ๋ฅผ ํ๋ ์์ ์์ setState๋ฅผ ํ์ฌ style ๋ํ ๋ณ๊ฒฝ ํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด, onStop์ ํตํด ๋๋๊ทธ๋ฅผ ์ข ๋ฃํ๋ ์์ ์ ๋ค์ setState๋ฅผ ํ์ฌ stlye์ ๋ณ๊ฒฝํด ์ค๋๋ค.
'๊ฐ๋ฐ ๐พ > ReactJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React ์์ useRef ์ฌ์ฉํ๊ธฐ (0) | 2021.06.30 |
---|---|
React ์์ ์ ๋๋ฉ์ด์ , ์ธํฐ๋ ์ ๊ตฌ์ถํ๊ธฐ (emotion / tweenmax) (0) | 2021.06.23 |
๋ฆฌ์กํธ์์ setInterval์ ์ฌ์ฉํ์ฌ ํ์ดํ ํจ๊ณผ ์ฃผ๊ธฐ (0) | 2021.06.18 |
React ์์ select ์ฌ์ฉํ๊ธฐ (6) | 2021.06.14 |
React div ์คํฌ๋กค์ Fix ํ๊ธฐ (Element scroll) (0) | 2021.06.11 |