# π€Ήπ» νλ‘ νΈμλ μνκ΄λ¦¬
# π§πΌβπ μν κ΄λ¦¬λ₯Ό μμμΌ νλ μ΄μ
βλ°μ΄ν°κ° λ³ν λλ§λ€ λ°μ΄ν°μ κ΄λ ¨λ domμ μΌμΌν μ°Ύμμ μ‘°μνκ³ μΆμ§ μλ€λ©΄ βμ 체 λ°μ΄ν°μ ννμ 리μ€νΈλ₯Ό ν κ³³μμ ν¨μ¨μ μΌλ‘ κ΄λ¦¬νκ³ μΆλ€λ©΄
# π₯ μνλ
νλ‘ νΈμλ νλ‘κ·Έλλ°μ νλ©΄μ μν(state)κ΄λ¦¬λΌλ μ©μ΄λ₯Ό λ§μ΄ μ°λλ°μ. μνλ μ½κ² λ§νλ©΄ 'λ°μ΄ν°' λΌκ³ μκ°νλ©΄ μ’μ κ² κ°μ΅λλ€. μ΄ μν κ΄λ¦¬λ μ΄ν리μΌμ΄μ μ΄ λ³΅μ‘ν΄μ§μλ‘ μ μ μ΄λ €μμ§λλ€. κ·Έλ κΈ° λλ¬Έμ λ¨μν ꡬ쑰μΌλλΆν° μ΄ μνλ₯Ό μ΄λ»κ² κ΄λ¦¬νλ©΄ μ’μμ§μ λν κ³ λ―Όμ μΆ©λΆν ν΄λ³΄λ κ²μ λ ν° μ΄ν리μΌμ΄μ μ λ§λ€κΈ° μν κ³Όμ μμ μ€μν©λλ€.
λ¨Όμ μνλ 무μμΌκΉμ? μνκ° μκ³ , μνκ° μλ κ²μ΄ μμν λ°μ. λμ μ΄λ€ μ°¨μ΄κ° μμκΉμ? μνμμ μ€μν λΆλΆμ λ°λ‘ κ°μ΄ λ³νλ€λ κ²μ λλ€. μ΄ κ°μ΄ λ³νλλ° μμΈ‘λ κ°μΌλ‘ λ³ν΄μΌ μλνλλ‘ λμμ μνν μ μμΌλ, μμΈ‘ λ²μ μμμ λ³νκ² νλ κ²μ΄ μ€μν©λλ€. κ·Έλμ κ·Έ μμΈ‘λ λ²μλ₯Ό λ§λ€κΈ° μν΄μ, μ¬λ¬κ°μ§ μ μ½μ‘°κ±΄μ΄λ ꡬ쑰μ μΈ μ€κ³λ₯Ό κ³ λ―Όν μ μμ΅λλ€.
μ΄ μμΈ‘ λ²μλ₯Ό μ΅μν νκΈ° μν΄μλ μνμ λν΄ μΌκ΄λκ² READνλ λ‘μ§κ³Ό, μ΅μνν Writeνλ λ‘μ§μ λ§λ€ λ κ°λ₯ν΄μ§λλ€.
λ²μλ₯Ό μ΅μννλκ±°λ λͺ¨λ λ¨μ, μ€μ½ν λ¨μμ λν κ³ λ―ΌμΌλ‘ νμ₯λ μ μμ΅λλ€. μνμ λν μΌκ΄μ±μ μνλ₯Ό μ¬λ¬ κ³³μμ κ°μ λ°©μμΌλ‘ READνλ λ°©μμ κ³ λ―Όν΄λ³Ό μ μμ΅λλ€. μνλ₯Ό μ¬λ¬ κ³³μμ μ§μ μ μΌλ‘ μμ νλ€λ©΄, μνλ₯Ό μμΈ‘νκ³ κ΄λ¦¬νκΈ° μ΄λ €μ°λ μμ νλ λΆλΆμ μ ννκ³ , κ·Έ μ± μμ κ°μ§κ³ μλ λμμ΄ λΆλͺ νκ² μν μ κ°μ§λ€λ©΄ μ΅μνν writeκ° κ°λ₯ν΄μ§ μ μμ΅λλ€.
νλ‘ νΈμλμ μν κ΄λ¦¬λ₯Ό Todo Listλ₯Ό ν΅ν΄μ μ΄λ»κ² ν μ μμμ§ κ³ λ―Όν΄λ³΄κ² μ΅λλ€.
μ TodoList μ±μ TodoItemsλΌλ λ°μ΄ν° κ°μ κ°μ§λλ€. κ·Έλ°λ° μ΄ λ°μ΄ν°λ₯Ό μ¬λ¬κ΅°λ°μμ κ΄λ¦¬νλ€λ©΄ ν κ³³μ λ³νκ° μμ λλ§λ€, λͺ¨λ λ³νλ₯Ό κ°μ§νκ³ λ°μνλ €λ©΄ μ€λ³΅ μ½λλ λ§μμ§κ³ λΆνμν dom μ κ·Ό λν λ§μμ§ μ μμ΅λλ€. κ·Έλ λ€λ©΄ μ΄ λ°μ΄ν°λ₯Ό μ΄λ»κ², μ΄λμ κ΄λ¦¬νλ©΄ μ’μκΉμ?
μ°μ λ°μ΄ν°μ κ΄λ ¨λ λΆλΆλ€μ 체ν¬νκΈ° μν΄ μμ λ¬Έμμμ 보μλ κ²μ²λΌ λ°μ΄ν°λ₯Ό κ°μ§κ³ κ°±μ λμΌ νλ κΈ°μ€μΌλ‘ UIλ₯Ό λΆλ¦¬ν΄λ³΄κ² μ΅λλ€.
λ μΈλΆμ μΌλ‘ λΆλ¦¬ν μ λ μμ§λ§, μ°μ μ μ΄ 4κ°μ§λ‘ λΆλ¦¬ν΄λ³Όκ±΄λ°μ. μμ²λΌ ꡬλΆνκ³ λλ©΄, TodoAppμ΄λΌλ μ»΄ν¬λνΈ μμ TodoInput, TodoList, TodoCount UIλ€μ΄ ν¬ν¨λμ΄ μμ΅λλ€.
μ»΄ν¬λνΈλ₯Ό λ μΈλΆμ μΌλ‘ λΆλ¦¬ν μ λ μμ§λ§, μ°μ μ μ΄ 4κ°μ§λ‘ μ»΄ν¬λνΈλ₯Ό λΆλ¦¬ν΄λ³΄λλ‘ νκ² μ΅λλ€, μμ²λΌ ꡬλΆνκ³ λλ©΄, TodoAppμ΄λΌλ μ»΄ν¬λνΈ μμ TodoInput, TodoList, TodoCount μ»΄ν¬λνΈλ€μ΄ ν¬ν¨λμ΄ μμ΅λλ€. κ·Έλ¦¬κ³ TodoItems
λΌλ λ°μ΄ν°λ TodoInput
, TodoList
, TodoCount
3κ°μ μ»΄ν¬λνΈμ λͺ¨λ κ΄λ ¨μ΄ μλλ°μ. κ·Έλ λ€λ©΄ TodoItems
μ μ°κ²°μ±μ κ°μ§ μ΄ λ°μ΄ν°λ₯Ό μ΄λμ κ΄λ¦¬νλ©΄ μ’μκΉμ? μμμ writeλ μ΅μνμΌλ‘ μν μ λΆμ¬νλ©΄ μ’λ€κ³ νλλ°μ. κ·Έλ λ€λ©΄ μ΄ μνμμ λ°μ΄ν°λ₯Ό ν κ³³μμ κ΄λ¦¬νλ€λ©΄ TodoApp μ»΄ν¬λνΈμμ νκ³ , λ€λ₯Έ μ»΄ν¬λνΈλ€μ κ·Έ λ°μ΄ν°λ₯Ό λ°μμμ 보μ¬μ£ΌκΈ°λ§ νλ€λ©΄ λ°μ΄ν°λ₯Ό μΌκ΄λκ² κ΄λ¦¬ν μ μμ κ² κ°μ΅λλ€.
κ·Έλμ κΈ°λ³Έμ μΌλ‘ ꡬννκΈ°μ κ°λ¨ν κ΅¬μ‘°κ° μμ΅λλ€. λ°λ‘ setState
μ render
ν¨μμ ꡬνμ
λλ€.
# π setState & ποΈ render
inputμ°½μ todoItemμ μλ‘ μΆκ°νλ€κ³ νμ λ, κ·Έ μΆκ°νλ λ©μλλ₯Ό λΆλͺ¨ μ»΄ν¬λνΈμμ κ΄λ¦¬νκ³ , μμ μ»΄ν¬λνΈλ λΆλͺ¨ μ»΄ν¬λνΈκ° λ°μ΄ν°λ₯Ό μ§μ λ€λ£¨λ λ©μλλ₯Ό μ¬μ©νκΈ°λ§ νλ κ²μ λλ€.
// λΆλͺ¨ μ»΄ν¬λνΈ
function TodoApp() {
this.todoItems = [];
this.setState = updatedItems => {
this.todoItems = updatedItems;
todoList.setState(this.todoItems);
};
new TodoInput({
onAdd: contents => {
const newTodoItem = new TodoItem(contents);
this.todoItems.push(newTodoItem);
this.setState(this.todoItems);
}
});
}
// μ
λ ₯ λ°λ μ»΄ν¬λνΈ
function TodoInput({ onAdd }) {
const $todoInput = document.querySelector("#new-todo-title");
$todoInput.addEventListener("keydown", event => this.addTodoItem(event));
this.addTodoItem = event => {
const $newTodoTarget = event.target;
if (this.isValid(event, $newTodoTarget.value)) {
onAdd($newTodoTarget.value);
$newTodoTarget.value = "";
}
};
}
// todoList 보μ¬μ£Όλ μ»΄ν¬λνΈ
function TodoList() {
this.setState = updatedTodoItems => {
this.todoItems = updatedTodoItems;
this.render(this.todoItems);
};
this.render = items => {
const template = items.map(todoItemTemplate);
this.$todoList.innerHTML = template.join("");
};
}
μ΄λ κ² νλ©΄, λ°μ΄ν°λ₯Ό ν κ³³μμ ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μκ³ λ°μ΄ν°κ° λ³κ²½λμμ λ λ λλ§μ μλ‘ ν΄μ£Όλ λ‘μ§λ μ¬μ¬μ©ν μ μμ΅λλ€.
# π μ 리
- νλ‘ νΈμλμμ μνκ΄λ¦¬λ ν κ³³μμ νλ©΄ ν¨μ¨μ μΌλ‘ ν μ μλ€.
- 보ν΅μ μ΅μμ μ»΄ν¬λνΈλ, storageλ₯Ό λ°λ‘ λμ΄ κ΄λ¦¬νλ€.
- μμ μ»΄ν¬λνΈλ€μ μ΅μμ μνλ₯Ό κ°μ§κ³ μλ κ°μ²΄λ‘λΆν° μνλ₯Ό λ°μ renderν΄μ£Όλ μν μ νλ€.