2022. 6. 16. 19:26ใ๊ฐ๋ฐ/๊ฐ์ํ๊ธฐ
๋ฒ์จ 2์ฃผ์ฐจ๊ฐ ๋์๋ค! โจ
์ด๋ฒ ๋ฏธ์ ์ 1์ฃผ์ฐจ์ ๋ง๋ค์๋ TodoList์ ๋ค์ํ ์ปดํฌ๋ํธ๋ค์ ์ถ๊ฐํด์ TodoApp์ผ๋ก ๋ง๋๋ ๋ฐฉ์์ผ๋ก ์งํ๋์๋ค.

TodoApp์ ๊ธฐ๋ฅ์ด ๋ ๋ง์์ง๊ณ ์ปดํฌ๋ํธ๋ค์ด ๋ ์ถ๊ฐ๋๋ฉด์ ์๊ตฌ์ฌํญ์ด ์กฐ๊ธ ๋ ๋ณต์กํด์ก๋ค. ๊ทธ๋์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ํ๊ธฐ ์ ์ ํผ๊ทธ๋ง๋ฅผ ํตํด ๊ฐ ์ปดํฌ๋ํธ๋ค์ ๊ตฌ์กฐ๋ฅผ ์ง๋ฉด์ ๊ฐ๋จํ ๋์์ธ ์์ ์ ์งํํ๋ค. ์ด๋ ๊ฒ ์๊ตฌ๋ถ์ · ๋์์ธ · ํผ๋ธ๋ฆฌ์ฑ์ ๋ฐ๋์ ์ ๋์ ์๊ฐ์ ์ผ๋๋ฐ, ํผ๋ธ๋ฆฌ์ฑํ ๋ ๋งจ๋ SCSS ์ฐ๋ค๊ฐ ์ค๋๋ง์ CSS๋ก ํ๋๊น ๋ถํธํด์ SCSS๊ฐ ์ ๋ง ๊ทธ๋ฆฌ์ ๋ค..

๊ตฌ์กฐ๋ฅผ ์ง ํ์๋ ๋ณธ๊ฒฉ์ ์ผ๋ก TodoApp์ ๊ฐ ์ปดํฌ๋ํธ๋ค์ ๋ง๋ค๊ณ , ๊ธฐ๋ณธ์ ์ธ CRUD๋ฅผ ์ถ๊ฐํ๋ค.
๊ทธ์ค์์ ์์ /์ญ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด์๋ ์ ๋ํฌํ id๊ฐ์ด ํ์ํ๋๋ฐ, ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์ต๋ํ ๋ณ๊ฒฝํ์ง ์๊ธฐ ์ํด์ ๋ฐฐ์ด์ index์ ํ์ฉํด์ ๊ตฌํํ๋ค.

// ๐ render ํจ์
render() {
this.$element.innerHTML = this.state
.map(
({ text, isCompleted }, idx) =>
`
<li class="todo-item" data-index=${idx}>
<label class="form-check-group">
<input class="form-check" type="checkbox" ${
isCompleted ? 'checked' : ''
} />
<span>${text}</span>
</label>
<button class="btn delete-button" type="button">delete</button>
</li>
`
)
.join('');
}
// ๐ addTodo ํจ์
addTodo(newText) {
const newData = [...this.data, { text: newText, isCompleted: false }];
this.setState(newData);
}
// ๐ deleteTodo ํจ์ : index ๊ฐ์ ์ฌ์ฉํด ๊ฐ ์ญ์
deleteTodo(index) {
const newData = this.data.filter((todo, i) => i !== parseInt(index));
this.setState(newData);
}
// ๐ toggleTodo ํจ์
toggleTodo(index) {
const newData = this.data.map((todo, i) =>
i === parseInt(index) ? { ...todo, isCompleted: !todo.isCompleted } : todo
);
this.setState(newData);
}
๋ค์์ผ๋ก๋ Custom Event, Local Storage๋ฅผ ์ฌ์ฉํ๋ ์ถ๊ฐ ๊ตฌํ ์ฌํญ์ ์งํํ๋๋ฐ, ์ด์ฏค๋ถํฐ๋ ์ด๋ฏธ ํ๋ฃจ์น ๋ ์ฌ์ฉ๋์ ์ด๊ณผํ ๋๋์ด ๋ค๊ณ ๋๋ฌด ์กธ๋ ธ๋ค๐ ๊ทผ๋ฐ ์ฌ๊ธฐ์ ๋ฉ์ถ๊ณ ์๋ฉด ์ ์ ์ ๋๋ก ๋ชป ์ ๊ฒ ๊ฐ์์ ๋ช ์ค ์ ๋๋ ๋์ถฉ์ด๋ผ๋ ์์ฝ๋ฉํด๊ฐ๋ฉด์ ์๊ตฌ์ฌํญ์ ๋ถ์ํ๊ณ ๋ก์ง์ ์งฐ๋ค.
์ปค์คํ ์ด๋ฒคํธ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ ์ด๋ฒ ๋ฏธ์ ์์ ์ฒ์ ์๊ฒ ๋ ๊ฐ๋ ๋ค์ด๋ผ์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ฐฌ์ฐฌํ ์ดํด๋ณด๋ ์๊ฐ์ ๊ฐ์ก๋ค. ํนํ ์ปค์คํ ์ด๋ฒคํธ๋ฅผ ์ด๋ป๊ฒ ์ฐ๋์ง ํ์ ํ๊ธฐ ์ํด์ ์ด๋ฒคํธ์ ๋ํด ์ ์ฒด์ ์ผ๋ก ๋ค์ ์ ๋ฆฌ๋ฅผ ํ๋๋ฐ, ๋๋ถ์ ์ด ๊ณผ์ ์์ matches ๋ผ๋ ํจ์๋ ์๊ฒ ๋๋ค! ์ง๊ธ๊น์ง ์ด๋ฒคํธ ์์ ๊ด๋ จํ ์ฝ๋๋ฅผ ์งค ๋ $element.classList.contains('class')๋ก ๊ฐ ์์๋ค์ ํ์ธํ์๋๋ฐ $element.matches('.class')๋ฅผ ํ์ฉํ๋ฉด ํจ์ฌ ๊ฐ๋ ์ฑ์ด ์ข์ ๊ฒ ๊ฐ๋ค.
โ๏ธ ์ปค์คํ ์ด๋ฒคํธ

// ๐ ์ปค์คํ
์ด๋ฒคํธ ์ฌ์ฉํ์ฌ removeAll ๊ตฌํ
setRemoveAll() {
const $removeAllBtn = this.$root.querySelector('.remove-all-button');
$removeAllBtn.addEventListener('click', () => {
this.$root.dispatchEvent(new CustomEvent('removeAll'));
});
this.$root.addEventListener('removeAll', () => {
this.setState([]);
});
}
โ๏ธ ๋ก์ปฌ ์คํ ๋ฆฌ์ง

getState() {
try {
const storedState = JSON.parse(localStorage.getItem(this.name));
return storedState ? storedState : null;
} catch (e) {
console.error(e);
}
}
setState(nextState) {
this.state = nextState;
try {
localStorage.setItem(this.name, JSON.stringify(nextState));
} catch (e) {
console.error(e);
}
this.todoCount.setState(this.state);
this.todoList.setState(this.state);
}
๋ ํผ์ localStorage๋ฅผ ๊ตฌํํด๋ดค์ ๋๋ ์์์ ์ฒ๋ผ App์์์ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ๋ค ํ๋๋ก ํ๋๋ฐ, ๋กํ ๋์ ๋ผ์ด๋ธ์ฝ๋ฉ์ ๋ณด๋๊น ๋ฐ๋ก ๋ถ๋ฆฌ๋ฅผ ์ํค๋ ๊ฒ ํ์คํ ์ฌ์ฉํ๋ ์ ์ฅ์์๋, ๊ฐ๋ ์ฑ ์ธก๋ฉด์์๋ ํจ์ฌ ์ด๋์ด์๋ค! ํ ๋ฒ ์ ๋๋ก ๊ตฌํํ๋ ๊ฒ์ ๋ณด๊ณ ๋์ ์ฐ์ตํ๊ณ ๋๋๊น ์ฌ๋์ด ์ฐธ ๊ฐ์ฌํ ๊ฒ ๋ถ๊ณผ ๋ฉฐ์น ์ ์ ์์ฑํ๋ ๋ด ์ฝ๋๊ฐ ๊ต์ฅํ ๋ฏ์ค์๋ค..ใ ...
export default function App({ selector, name }) {
const storage = new Storage(name, []); // ๐ Storage๋ก ๋ถ๋ฆฌํ ๋ชจ์ต
this.$root = document.querySelector(selector);
this.name = name;
this.state = storage.getItem(); // ์ฌ์ฉํ๊ธฐ ๊ฐํธํด์ก๋ค โจ
//...
this.setState = function (nextState) {
this.state = nextState;
storage.setItem(nextState); // ์ฌ์ฉํ๊ธฐ ๊ฐํธํด์ก๋ค โจ
todoList.setState(this.state);
todoCount.setState(this.state);
};
}
์ ์ฒด์ ์ผ๋ก App์์ ๋ชจ๋ ์ผ์ ์ฒ๋ฆฌํ๊ณ ๊ฐ ์ปดํฌ๋ํธ๋ค์ด render๋ง ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ function ํ์ ์ผ๋ก ๋ค์ ๋ฆฌํํ ๋งํด๋ณด๋ฉด์ ๊ฐ ์ปดํฌ๋ํธ๋ค์ด ์ฑ ์์ ๋๋ ๊ฐ์ง๋๋ก ๊ตฌํํ๋ ๊ฒ์ ์ต์ํด์ง๋๋ก ์ฐ์ตํ๋ค. 1์ฃผ์ฐจ๋ ์ ๋ง ์๋ฐ์ ์ด์๋๊ฒ, 2์ฃผ์ฐจ๋ถํฐ๋ ๋ผ์ด๋ธ์ธ์ ์์๋ ๋ฐฐ์ธ๊ฒ ์ ๋ง ๋ง์๋ค. ์ฝ๋๋ฆฌ๋ทฐ๋ก ์ ๋ง ์๊ฐ์น๋ ๋ชปํ๋ ๋ถ๋ถ๋ค๊น์ง ์ธ์ธํ๊ฒ ํผ๋๋ฐฑ์ ๋ฐ๊ณ , ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ฆฌ์กํธ์ ํก์ฌํ๊ฒ ๊ตฌํํด๋ณด๋ฉด์ ์ฝ๋ ์ต๊ด์ด ์์๊ฒ ์ ๋ฆฌ๋๋๊ฒ ์ค์๊ฐ์ผ๋ก ๋๊ปด์ก๋ค. ์ข์ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฐ๋ผํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ ๋ง ๋ง์ด ๋ฐฐ์ธ ์ ์๋ ๊ฒ ๊ฐ๋จ ์๊ฐ์ด ๋ค์๊ณ , ๊ทธ๋ฐ ์๋ฏธ์์ ์ด๋ฒ ์ฝ๋๋ฆฌ๋ทฐ ์คํฐ๋๊ฐ ์ ๋ง ๋ง์ด ์ฑ์ฅํ ์ ์๋ ๊ธฐํ์ธ ๊ฒ ๊ฐ๋ค ๐
https://programmers.co.kr/learn/courses/14237
[์คํฐ๋/16๊ธฐ] ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ (feat. VanillaJS)
๐ ์์ฝ์ง๋ง 16๊ธฐ๋ ๋ง๊ฐ๋์์ด์. 17๊ธฐ ์คํ ์๋ฆผ ์ ์ฒญํ๊ณ , ์ต์ ๊ฐ์ ์๊ฐํ์ธ์! ์ต์ ๊ฐ ์๋ฆผ ๋ฐ๊ธฐ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์จ๋ผ์ธ ์คํฐ๋ ์๋์ด ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ, ์๋ผ๋
programmers.co.kr
'๊ฐ๋ฐ > ๊ฐ์ํ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [1์ฃผ์ฐจ ์คํฐ๋ ํ๊ธฐ/15๊ธฐ] ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ (feat. VanillaJS) (0) | 2022.05.20 |
|---|