์ด๋ฒ ์ฑํฐ๋ ๋๋๊ทธ ์ค ๋๋กญ API์ ๋ํด ๋ค๋ฃจ์์ต๋๋ค.
โ ๏ธ ์ ๋ฆฌํ ๋ด์ฉ์ ์คํ๋ ์๋ชป๋ ์ ๋ณด๊ฐ ์์ ์ ์์ต๋๋ค. ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
HTML ๋๋๊ทธ ์ค ๋๋กญ ์ธํฐํ์ด์ค๋ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋๋๊ทธ ์ค ๋๋กญ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฒ ํด์ค๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ด์ฉํด ์ฌ์ฉ์๋ draggable ์์๋ฅผ ๋๋๊ทธํ๊ณ , ๋ง์ฐ์ค ๋ฒํผ์์ ์์ ๋์ผ๋ก์จ ์์๋ฅผ ๋๋กญํ ์ ์์ต๋๋ค. ๋๋๊ทธํ๋ ๋์ draggable ์์๋ ๋ฐํฌ๋ช ํ ์ฑ๋ก ๋ง์ฐ์ค ํฌ์ธํฐ๋ฅผ ๋ฐ๋ผ๋ค๋๋๋ค.
HTML ๋๋๊ทธ ์ค ๋๋กญ์ DOM ์ด๋ฒคํธ ๋ชจ๋ธ๊ณผ ๋๋๊ทธ ์ด๋ฒคํธ๋ฅผ ๋ง์ฐ์ค ์ด๋ฒคํธ๋ก๋ถํฐ ์์๋ฐ์ต๋๋ค.
// TodoList.js
<ul>
${todosmap(({ _id, content }) =>`
<li data-id="${_id}" draggable="true">${content}
<button>x</button>
</li>`).join('')}
</ul>
dragstart
๋ก ๋๋๊ทธ ํ๊ธฐ ์์ํ๋ฉด ๋ฐ์ดํฐ ์ ๋ฌ ๊ฐ์ฒด์ ๋์ ์์์ id๋ฅผ ์ถ๊ฐํฉ๋๋ค.$todoList.addEventListener('dragstart', (e) => {
const $li = e.target.closest('li');
e.dataTransfer.setData('todoId', $li.dataset.id);
});
dropover
์ด๋ฒคํธ๊ฐ ๋ฐ์๋์์ ๋ ํ์ฌ๋ก . $todoList.addEventListener('dragover', (e) => {
e.preventDefault(); // ์ถ๊ฐ์ ์ธ ์ด๋ฒคํธ๊ฐ ์ผ์ด๋์ง ์๋๋ก ํจ
e.dataTransfer.dropEffect = 'move'; // ํ์ฌ ์ ํ๋ ๋์ด์ ๋๊ธฐ ์์
์ ์ ํ์ move(๋ฐ์ดํฐ๊ฐ ์ด๋ํ ๊ฒ์์ ์์)๋ก ์ค์
});
drop
์ด๋ฒคํธ๊ฐ ๋ฐ์๋๋ฉด ๋์์ id๋ฅผ ๊ฐ์ ธ์์ ๋น๊ต ํํ onDrop ์ด๋ฒคํธ๋ก App์ id๋ฅผ ์ ๋ฌํฉ๋๋ค.$todoList.addEventListener('drop', (e) => {
e.preventDefault();
const droppedTodoId = e.dataTransfer.getData('todoId');
// ํ์ฌ TodoList์ Todo๊ฐ ์๋ ๊ฒฝ์ฐ ์์ ์ปดํฌ๋ํธ์ ์๋ฆผ
const { todos } = this.state;
if (!todos.find((todo) => todo._id === droppedTodoId)) {
onDrop(droppedTodoId);
}
});
onDrop
์ผ๋ก ๊ฐ์ ธ์จ id๋ก state๋ฅผ ๋ณ๊ฒฝ์ํต๋๋ค.const inCompletedTodoList = new TodoList({
onDrop: (todoId) => handleTodoDrop(todoId, false),
onRemove: handleTodoRemove,
});
const completedTodoList = new TodoList({
onDrop: (todoId) => handleTodoDrop(todoId, true),
onRemove: handleTodoRemove,
});
์์ ๊ฐ์ ์์๋ก droppable ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๋๋ฆฌ์คํธ์์ ๋ฏธ์๋ฃ -> ์๋ฃ ํน์ ์๋ฃ -> ๋ฏธ์๋ฃ๋ก ์์ ๋กญ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋๋๊ทธ ์ค ๋๋กญ์ด ๋ฏ์ค๋ค ๋ณด๋ e.preventDefault()
๋ผ๋์ง e.dataTransfer.getData('todoId');
๋ฑ์ ์ธ์ ์ฌ์ฉํด์ผ ํ๋์ง ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง๊ฐ ๋๋ฌด ํท๊ฐ๋ ธ์ต๋๋ค.
Vanilla JS๊ณผ์ ์ ๋ง๋ฌด๋ฆฌํ๋ฉฐ..
์ฒ์ TodoList ๋ง๋ค๊ธฐ๋ถํฐ ๋ง์ง๋ง ๋๋๊ทธ ์ค ๋๋กญ๊น์ง ๊ฑฐ์ 4์ฃผ๊ฐ ๋ค ๋๋ ์๊ฐ๋์ VanillaJS๋ฅผ ๋ฐฐ์ฐ๊ณ ๋๋์ด ํ๋์ ๊ธฐ๊ฐ์ด ๋๋ฌ์ต๋๋ค!๐ ๋ฒ์จ ๋ฐ๋ธ์ฝ์ค๋ฅผ ์์ํ์ง 6์ฃผ๊ฐ ์ง๋ ๊ฒ์ด ๋งค์ฐ ๋๋๊ณ (์๊ฐ ์ง์ง ๋๋ฌด๋๋ฌด ๋น ๋ฅด๋ค) ๊ธฐ๋ณธ ์ง์๋ ๊ฐ์ง๊ณ ์์ง ์๋ ๋ด๊ฐ VanillaJS๋ฅผ ๋ฐฐ์ฐ๋ฉด์ ์ปดํฌ๋ํธ ๋ถ๋ฆฌ, ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฑ์ ์์ ๋กญ๊ฒ ๋ง์ง ์ ์๋ ์์ค์ด ๋์๋ค๋ ๊ฒ์ด ๋๋ฌด ๊ฐ๋์ ์ด์๋ค. ์๋ฌด๋๋ ์ฃผ์์์ ๋ง์ด ๋์์ ์ฃผ์
์ ์์ํ๊ฒ(?) ๋ฐฐ์ธ ์ ์์ง ์์๋ ์ถ๋ค. ์์ง๋ ๋ชจ๋ฅด๋ ๊ฐ๋
์ด ๋๋ฌด ๋ง๊ณ ์ฝ๊ฒ์ฝ๊ฒ ๊ธฐ๋ฅ์ ๋ง๋ค์ง๋ ๋ชปํ์ง๋ง ๊พธ์คํ ๊ณผ์ ๋ ํ๊ณ ๋ฐฐ์ฐ๋ค ๋ณด๋ฉด ์ด๋ ์๊ฐ ์ฑ์ฅํด ์์ง ์์๊น??
์ ๋ฒ์ฃผ๊น์ง๋ง ํด๋ ํฐ๋ ๋ง์ด ์๋์ง๋ง(๋๋..?ใ ใ ) 3์ผ์ ๋ถ์ฌ๊ฐ ๋ง๋ค์ด๋ธ ์์ฒญ๋ ํญํ๊ฐ์ ๋ฐ๋ฆฐ ๊ณผ์ , ๊ฐ์, ์คํฐ๋ ๋ค์ ๋ง์ด ํ๋ค์์๋ค.๐ญ ๊ทธ๊ฑธ ๋ฉ๊พธ๊ธฐ ์ํด์ 10์ผ๋์ ํ๋ฃจ์ 4-5์๊ฐ๋ ๋ชป ์๋ฉด์ ํ๋ํ๋ ํด์น์ ๋๊ฐ๋ค. ์ฌ์ค ์์ง๋ ๊ฐ์๋ ๋ฐ๋ ค์๊ณ , ๊ทธ๋์ ๊พธ์คํ ์ฐ๋ TIL๋ ํ๋์ ๋ชป์ผ๊ณ ๊ณผ์ ๋ ๋ง์กฑํ์ง ๋ชปํ๋ ์ํ๋ก ์ ์ถํ์ฌ ๋งค์ฐ ์์ํ์ง๋ง ๊ทธ๋๋ ์ด์ ๋๊น์ง ํด๋ธ ๋์๊ฒ ์นญ์ฐฌํด์ฃผ๊ณ ์ถ๋ค.๐
ํ์๋ถ๋ค์ด ์์์ ๋ง์ด ๋์์ ์ฃผ๋ ค๊ณ ํ์ จ๊ณ ์ฌ๋ฌ ์คํฐ๋์์๋ ๋ง์ด ์ ์ํฉ์ ๊ณ ๋ คํด์ฃผ์ จ๋ค๋ ๊ฒ์ ์๊ณ ์๋ค. ์ด TIL์ ๋น๋ ค ๊ฐ์ฌ ์ธ์ฌ๋ฅผ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค!!๐๐ป๐ฅฐ (๊ฐ์ฌํด์ ์ ๋ง๋ก) ๋๋ถ์ ๋ฒํธ ์ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.โค๏ธ
์ด์ ํ๋์ ๋ ๋ฌ๋ ค์ผํ๊ธฐ ๋๋ฌธ์ ๋ด์ผ ํ๋ฃจ๋ ๋ง์๊ป ์ฌ๋ ค๊ณ ํ๋ค! ๋๋์ด!! ๋ฐ๋ธ์ฝ์ค ์์ํ๊ณ ์ฒ์ ์ ๋๋ก ์ฌ๋ ๋ ์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค!๐ ํ๋ฃจ๋์ ๋ฆฌํ๋ ์ฌํ๊ณ ์ฌ์ ๋นํด์ ์ค๊ฒ ์ต๋๋ค!
์๊ฒฝ๋~~ ์ ๋ง ์๊ณ ๋ง์ผ์ จ์ด์ใ ใ
์ง์คํ๊ธฐ ํ๋ ์ํฉ์์๋, ๋๊น์ง ์๊ฒฝ๋์ ์ผ์ ํด์น์๋๊ฐ์ ๋ชจ์ต์ด ์ง์ง์ง์ง ๋ฉ์ ธ์!!
ํ ์์ผ ๋ฆฌํ๋ ์ฌํ์๊ณ ๋ค์ ์๋์ ํฑํ ๋ชจ์ต์ผ๋ก ๋ง๋ฉ์๋นโฅโฅ
์ฝ์ํธ๋ ์ ๋ค๋ ์ค์๊ตฌ์!!