์์ Element๊ฐ ์์ ๋ Drag&Drop Event ๊ฐ ์ฌ๋ฌ ๋ฒ ํธ์ถ ๋๋ ์ด์
0. ๊ฐ์
ํ ๋ด ์ฝ๋ ๋ฆฌ๋ทฐ ์ค React ์ปดํฌ๋ํธ์์ Drag&Drop Event๊ฐ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋์ด ์ปดํฌ๋ํธ๊ฐ Drag&Drop Event๊ฐ ํธ์ถ๋๋ ๋งํผ ๋ฆฌ๋ ๋๋ง๋๋ ์ด์๊ฐ ์์์ต๋๋ค.
์๋ํ ๋์์ ์ปดํฌ๋ํธ์ mouse over ์ ๋ฌด์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ด์๊ธฐ ๋๋ฌธ์ ๊ณ์ํด์ ๋ฆฌ๋ ๋๋ง๋๋ ์ด์๋ ์ก์์ผ ํ ํ์๊ฐ ์์์ต๋๋ค.
์ด ๊ธ์์๋ ํด๋น ์ด์์ ๋ํ ์์ธ๊ณผ ์ด์๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
(์๋ ์์ ๋ค์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด์ด console.log๋ฅผ ํ์ธํ๋ฉด์ ํ ์คํธ ํด๋ณด๋ ๊ฒ ์ข์ต๋๋ค.)
See the Pen Drag&Drop Event Example by ์ค์ฐฝํ (@ibgcsnij-the-selector) on CodePen.
1. ์์ธ
์ ์์ ๋ฅผ ํ ๋๋ก ์์ธ์ ์์๋ณด์๋ฉด, Drag ์ค์ธ ์ํ์ ํฌ์ธํฐ๊ฐ ์์ ์ปดํฌ๋ํธ์ ์ ๊ทผํ๋ฉด dargleave ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด์ isDragging์ด false๊ฐ ๋๊ณ dragenter ์ด๋ฒคํธ๊ฐ ๋ฐ๋ก ์คํ๋์ด isDragging์ด true <-> false๋ก ๋ฐ๋๋ฉด์ ๊ณ์ํด์ ๋ ๋๋ง ๋๋ ๊ฒ์ด์์ต๋๋ค.
ํ์ฌ๋ dragenter์ dragleave ๋ฟ์ด์ง๋ง, dragover๊ฐ ์ถ๊ฐ๋๋ค๋ฉด, ๋ฆฌ๋ ๋๋ง์ ๋ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
2. ํด๊ฒฐ ๋ฐฉ๋ฒ
๊ฐ์์์ ๋งํ ๊ฒ ์ฒ๋ผ ์๋ํ ๋์์ ์ปดํฌ๋ํธ์ mouse over ์ ๋ฌด์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ drag ์ค์ธ ๋ง์ฐ์ค๊ฐ ์ปดํฌ๋ํธ ์์ ์์ ๋ isDragging์ด false๊ฐ ๋์ด์๋ ์๋ฉ๋๋ค.
๊ทธ๋ ๊ธฐ์ ๋ค์ ์์ ์ ๊ฐ์ด dragleave event์ currentTarget๊ณผ relatedTarget ์ ์ด์ฉํด ์์ ๋ง์ฐ์ค๊ฐ ์์ element์ ์์นํ๊ฒ ๋๋ฉด dargleave ์ด๋ฒคํธ ๋ด ๋ก์ง์ ์คํํ์ง ์๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํด ์ค ์ ์์ต๋๋ค.
See the Pen Drag&Drop Event Example by ์ค์ฐฝํ (@ibgcsnij-the-selector) on CodePen.
currentTarget๊ณผ relatedTarget์ ๊ฐ ๋ง์ฐ์ค ์ด๋ฒคํธ ๋ง๋ค ๋์์ด ๋ฌ๋ผ์ง๋๋ฐ, dargeleave ์ด๋ฒคํธ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
draglaeve ์ด๋ฒคํธ์์์ currentTarget, relatedTarget
currentTarget: ๋ง์ฐ์ค๊ฐ ๋ ๋ element
relatedTarget: ๋ง์ฐ์ค๊ฐ ๋ค์ด๊ฐ๋ element
๋ค๋ฅธ ๋ง์ฐ์ค ์ด๋ฒคํธ์์์ currentTarget, relatedTarget์ด ๊ถ๊ธํ๋ค๋ฉด ๋ค์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
3. ๋ง์น๋ฉฐ
์์ธ์ ์๊ณ ์๋ค๋ฉด ์๊ฐ๋ณด๋ค ์ด๋ ต์ง ์์ ๋ฌธ์ ์ด์ง๋ง, ๋ชจ๋ฅธ๋ค๋ฉด ๋๋ ๋ชจ๋ฅด๊ฒ ๋์์์ด ๋ฆฌ๋ ๋๋งํ๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฐํด๋ผ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์๊ฐ์ผ๋ก ์คํ๋ ์ ์์ ๋ฒํ ์ด๋ฒคํธ๋ค์ ๋ค์ ํ ๋ฒ ์ ๊ฒํด๋ณด๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.