๋กํ ๊ฐ์ฌ๋์ ๋ฐ๋๋ผ JS ๊ฐ์ ๋์ฅ์ ์ ๋ง์ง๋ง ๋ ์ด์๋ค.
๊ธด ์๊ฐ ๋์ ๋ฐ๋๋ผ JS๋ก UI๋ฅผ ๊ฐ๋ฐํ ๋ ๊ณ ๋ คํด์ผ ํ ๋ง์ ํฌ์ธํธ๋ค์ ๋ฐฐ์ธ ์ ์์ด ์ข์ ๊ฑฐ ๊ฐ๋ค.
์ค๋์ ๋๋๊ทธ ์ด๋ฒคํธ์ ๋น๋๊ธฐ ํ๋ก์ธ์ค๋ฅผ ํ ์๋ฃ๊ตฌ์กฐ์ ๋ด์์ ํจ์จ์ ์ธ task ๊ด๋ฆฌ๋ฅผ ํ๋ ๋ฒ์ ๋ฐฐ์ ๋ค.
Todo List์์ ์๋ฃํ ์ผ๊ณผ ๋ฏธ์๋ฃ ํ ์ผ ๋ฆฌ์คํธ์์ ํ ์ผ์ ๋๋๊ทธ๋ก ์ด๋ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋ค.
drag ์ด๋ฒคํธ ์ค dragstart
, dragover
,drop
์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ค.
dragstart
: ๋ง์ฐ์ค ์ผ์ชฝํค๋ฅผ ๋๋ฌ ๋๋๊ทธ๊ฐ ์์๋ ๋ ๋ฐ์ํ๋ค. ๋๋๊ทธ์ ์์์ ์ ์๋ฏธํ๋ค. ์ด๋ค ์์๋ฅผ ๋๋๊ทธํ๋ ์ง๋ฅผ ์ด ๋ ์ ์ฅํด์ผ ํ๋ค.$todoList.addEventListener('dragstart', (e) => {
// ๋๋๊ทธ๊ฐ ์์๋ ๊ณณ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฆฌ์คํธ๋ฅผ ๋ฝ์์จ๋ค.
// ์ด๋ค ํ ์ผ์ด ๋๋๊ทธ๋๋์ง ํ์
ํ๊ธฐ ์ํจ.
const $li = e.target.closest('li');
// ํ ์ผ id ๋ฐ์ดํฐ ์ ์ฅ
e.dataTransfer.setData('todoId', $li.dataset.id);
});
dataTransfer
: ๋๋๊ทธ ์ด๋ฒคํธ๊ฐ ๊ฐ์ง๋ ๊ณ ์ ํ ๋๋๊ทธ ์์ ์ ๋ฐ์ดํฐ ๊ฐ์ฒด์ด๋ค.
dragstart
์ด๋ฒคํธ์์๋setData
๋ฉ์๋๋ฅผ ํตํด ํด๋ฆญํ ํ ์ผ์ id๋ฅผ ๋ฐ์ดํฐ ์ ์์ ๊บผ๋ด์ ์ ์ฅํ๋ค.
dragover
: ๋๋๊ทธ ๊ฐ๋ฅํ ์์ญ ์๋ฅผ ๋๋๊ทธ ์ค์ผ ๋ (์ ๋ฐฑ๋ฐ๋ฆฌ์ด๋ง๋ค ๋ฐ์ํ๋ค๊ณ ํ๋ค.)$todoList.addEventListener('dragover', (e) => {
// ๊ธฐ๋ณธ ๋๋๊ทธ ๋์ ๋ฐฉ์ง
e.preventDefault();
// dropEffect๋ฅผ ํตํด ์ ์์น๋ก ์ด๋ํ๋ ์๊ฐ์ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ค.
e.dataTransfer.dropEffect = 'move';
});
dragover
์ด๋ฒคํธ์์๋ ์ฃผ์ํ ์ ์ด ์๋ค.
e.preventDefault()
์ผ๋ก ๋๋๊ทธ์ ๊ธฐ๋ณธ ๋์์ ๋ง์ง ์์ผ๋ฉด ์ดํ ์ปค์คํ ํ์ฌ ์ง์ ํ๋ ๊ธฐ๋ฅ๋ค์ด ๋์ํ์ง ์๋๋ค๋ ์ ์ด๋ค.
์ฌ๊ธฐ์๋dropEffect
๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์๋ ๋ฐ๋์ ๊ธฐ๋ณธ ๋์์ ๋ง์์ผ ํ๋ค.
์ดํdrop
์ด๋ฒคํธ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฉํด์ผ ํ๋ค.
drop
: drop์ด ์ ํจํ ๋์์ ๋๋๊ทธํ๋ ์์๋ฅผ ๋์ผ๋ฉด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค. $todoList.addEventListener('drop', (e) => {
// ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ๋ณธ ๋์ ๋ฐฉ์ง
e.preventDefault();
// `dragstart`์์ ์ ์ฅํ๋ id ๊ฐ์ ธ์ค๊ธฐ
const droppedTodoId = e.dataTransfer.getData('todoId');
// ํ์ฌ TodoList์ Todo๊ฐ ์๋ ๊ฒฝ์ฐ ์์ ์ปดํฌ๋ํธ์ ์๋ฆผ
// ๋๊ฐ์ ์์๋ก ๋๋๊ทธ ๋๋กญํ์ ๋ ์ํ ๋ณ๊ฒฝ์ ๋ง์
const { todos } = this.state;
if (!todos.find((todo) => todo._id === droppedTodoId)) {
onDrop(droppedTodoId);
}
});
์ถ๊ฐ์ ์ผ๋ก ํ ์์๋ฅผ ๋๋๊ทธ ์ค ๋๋กญํ ์ข ์ฐฉ์ง๊ฐ ๋ณธ์ธ ์์์ผ ๊ฒฝ์ฐ์๋ ๋๋๊ทธ ์ค ๋๋กญํ ์๋ฏธ๊ฐ ์๋ค. ๋ฐ๋ผ์ ๋ถํ์ํ ๋๋๊ทธ ์ค ๋๋กญ์ผ๋ก api ํธ์ถ์ด ๋ฐ์ํ๋ฉด ์๋๋ฏ๋ก ์ด๋ฅผ ๋ฐฉ์งํด์ผ ํ๋ค.
TodoList์์๋ ์ฌ์ฉ์์ ๋ค์ํ ๋์์ด ๋ฐ์ํ๋ค.
์ง๊ธ ๋ง๋ ์ดํ๋ฆฌ์ผ์ด์
์ ๋๋๊ทธ ์ค ๋๋กญ, ์ญ์ ๊ธฐ๋ฅ์ผ๋ก ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
ํ์ง๋ง ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ํ๋์ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ๋์์์ผฐ๋ค๊ณ ์๊ฐํด๋ณด์.
ํ ์ผ 1
์ ๋ฏธ์๋ฃ ๋ฆฌ์คํธ์์ ์๋ฃ ๋ฆฌ์คํธ๋ก ์ฎ๊น- ๋ฏธ์ฒ ์๋ฃํ์ง ๋ชปํ ๋ถ๋ถ์ด ์์ด์ ๋ค์
ํ ์ผ 1
์ ์๋ฃ ๋ฆฌ์คํธ์์ ๋ฏธ์๋ฃ ๋ฆฌ์คํธ๋ก ์ฎ๊น- ๊ทผ๋ฐ ์๊ณ ๋ณด๋ ์ฒ๋ฆฌ ์๋ฃ์ธ๊ฑฐ ๊ฐ์ ๋ค์ ์๋ฃ ๋ฆฌ์คํธ๋ก ์ฎ๊น
- ์๋ฃํ ์ผ์ด๋ผ์ ์ญ์ ๋ฒํผ์ ๋๋ฆ
์ด๊ฒ์ ๋น๊ต์ ๋น ๋ฅธ ์๊ฐ ์์ ๋์ํ๋ค๊ณ ๊ฐ์ ํ์.
๊ฐ๋ฐ์์ ๊ด์ ์์๋ ์ ๋ค ๊ฐ์ง ๋์์ ์ํด ํ ์ผ์ ๋ํ ์ํ๋ฅผ ๋ถ๋ฌ์ค๋ fetchTodos
ํจ์๋ฅผ ์ด 4๋ฒ ํธ์ถํด์ผ ํ๋ค. ์ด๋-์ด๋-์ด๋-์ญ์
ํ์ง๋ง ํจ์จ์ ์ผ๋ก api์ ํธ์ถํ๊ธฐ ์ํด์๋ ์์ 1 ~ 3๊น์ง์ ๊ณผ์ ์ ๋ฌด์ํ๊ณ ๊ฒฐ๊ตญ์ ํ ์ผ 1
์ด ์ญ์ ๋ ๊ฒ์ด ์ต์ข
๊ฒฐ๊ณผ์ด๋ค.
๋ฐ๋ผ์ api ์
์ฅ์์๋ ์ญ์ ์ ๋ํ api ํธ์ถ๋ง ํ๋ฉด ๋๋ ๊ฒ์ด๋ค.
์ด๋ฅผ task ๊ด๋ฆฌ ๊ด์ ์์๋ ์ด๋ task 1 ~ 3์ ํ์ ์ ์ฅํด๋๋ค๊ฐ ์ญ์ task๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด ์ด์ ์ด๋ task๋ค์ ์ ๊ฑฐํ๊ณ ์ญ์ task๋ง ๋๊ธฐํํ๋๋ก ๊ตฌํํ๋ ๊ฒ์ด ํจ์จ์ ์ด๋ค.
๋ฌผ๋ก ์ฌ์ฉ์์๊ฒ๋ ๋๊ด์ ์ ๋ฐ์ดํธ ๊ธฐ๋ฒ์ ์ ์ฉํ์ฌ task 1~4 ์ ๋ํ ๋์์ด ๋ค ์ด๋ค์ง ๊ฒ์ฒ๋ผ ๋ณด์ด๋๋ก UX๋ฅผ ์ ๊ณตํด์ผ ํ๋ค.
// task ๊ด๋ฆฌ ํจ์
export default function SyncTasksManager() {
let tasks = []; // task ํ, ๋ฐฐ์ด๋ก ๊ตฌํ
// ๊ธฐ๋ณธ์ ์ธ move task๋ push
this.addTask = (task) => {
tasks.push(task);
};
// ์ญ์ task ๋ฐ์ ์ ์ด์ move task๋ ์ญ์
this.removeTasks = (urlPattern) => {
tasks = tasks.filter((task) => !task.url.includes(urlPattern));
};
// ์ต์ข
์คํ์ ์์๋๋ก shiftํ์ฌ api ์์ฒญ ๋ณด๋ด๊ธฐ
this.run = async () => {
// task๊ฐ ์์ ๋๊น์ง ์ฌ๊ท
if (tasks.length > 0) {
const task = tasks.shift();
await request(task.url, {
method: task.method || 'GET',
});
this.run();
}
};
}
์ด์ฒ๋ผ ์ฌ์ฉ์์ ๋์์ ๋ฐ๋ผ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก api ํธ์ถ์ ๋ฌด๋ถ๋ณํ๊ฒ ์์ฒญํ๋ฉด ์๋ฒ์ ๊ณผ๋ํ ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๊ณ ๋น์ฉ์ ์ธ ๊ด์ ์์๋ ๋ญ๋น๊ฐ ์ฌํ๋ค.
๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ ์ฌ์ฉ์์ ๋์์ ์ํด ์ต์ข ์ ์ผ๋ก ๋์ถ๋๋ ๊ฒฐ๊ณผ์ ๋ํด ์ฌ์ฌ์๊ณ ํ์ฌ ๋๊ด์ ์ ๋ฐ์ดํธ์ ์ด๋ฌํ ํ task ๊ธฐ๋ฒ์ผ๋ก ์ต๋ํ ํจ์จ์ ์ผ๋ก api๋ฅผ ํธ์ถํด์ผ ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
๋
ธ์
ํ๋ก์ ํธ์์ ์ฌ์ด๋ ๋ค๋น๋ฐ ๊ฒฝ๊ณ๋ฅผ ๋๋๊ทธํ๋ฉด ์ฌ์ด๋ ๋ค๋น๋ฐ์ ๋๋น๊ฐ ์กฐ์ ๋๋๋ก ๊ตฌํํด๋ณด๊ณ ์ถ์๋๋ฐ ์คํจํ์๋ค.
์ด์ drag ์ด๋ฒคํธ๋ฅผ ๋ฐฐ์ ์ผ๋ ์ด๋ฅผ ์ ์ฉํด์ ๊ตฌํํด๋ณผ ๊ฒ์ด๋ค.
๐ ํด๋น ๋ด์ฉ์ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์คํดํ๊ณ ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ํผ๋๋ฐฑ ๋ถํ๋๋ฆฝ๋๋ค.