There is no formation without repetition
구현
- LocalStorage
- EventDelegation
Psuedo Code
- value 로 입력값을 가져오기
- 객체의 형태로 만들어서 배열에 넣기
- submit 이후에 값 초기화하기
2. 배열에 담긴 내용을 HTML 에서 보여주기
- innerHTML 을 통해 동적으로 내용 추가하기
- map 메서드를 활용함으로써 배열 내 요소를 보여주기
- input 의 id 와 label 의 for 값을 같게 만듬으로써 서로가 연결되게 만들기
- join 을 활용해서 map 메서드의 결과 값을 string 으로 만들기
3. localStorage 활용하기
- localStorage 에 setItem을 활용해서 저장하기
- localStorage 에 getItem을 통해 localStorage 내 저장된 값 가져오기
4. EventDelegation 활용하기
- 체크된 결과 또한 reload 되었을 때 유지되게 만들기
- 동적으로 추가된 요소에 대해서도 toggle 기능을 할 수 있게 만들기
- 동적으로 추가된 리스트에 대해서 부모요소를 가져오기
- eventtarget 의 matches 기능 활용하여 일치하지 않는 요소는 반환값이 없게하기
Javascript
const addItems = document.querySelector('.add-items');
const itemsList = document.querySelector('.plates');
const items = JSON.parse(localStorage.getItem('items')) || [];
function addItem(e) {
e.preventDefault();
const text = this.querySelector('[name=item]').value;
const item = {
text,
done: false
};
items.push(item);
populateList(items, itemsList);
localStorage.setItem('items', JSON.stringify(items));
this.reset();
}
function populateList(plates = [], platesList) {
platesList.innerHTML = plates.map((plate, i) => {
return `
<li>
<input type="checkbox" data-index=${i} id="item${i}" ${plate.done ?
'checked' : ''}/>
<label for="item${i}">${plate.text}</label>
</li>
`;
}).join('');
}
function toggleDone(e) {
if (!e.target.matches('input')) return;
const el = e.target;
const index = el.dataset.index;
items[index].done = !items[index].done;
localStorage.setItem('items', JSON.stringify(items));
populateList(items, itemsList);
}
addItems.addEventListener('submit', addItem);
itemsList.addEventListener('click', toggleDone);
populateList(items, itemsList);
HTML
<div class="wrapper">
<h2>LOCAL TAPAS</h2>
<p></p>
<ul class="plates">
<li>Loading Tapas...</li>
</ul>
<form class="add-items">
<input type="text" name="item" placeholder="Item Name" required>
<input type="submit" value="+ Add Item">
</form>
</div>
기록
label 태그
- label 은 폼의 양식에 이름 붙이는 태그
- label 의 for 값과 양식의 id 의 값이 같으면 연결된다
- label 을 클린하면 연결된 양식에 입력할 수 있도록 하거나, 체크를 하거나 체크를 해제한다
더 공부할 내용
- append 와 appendChild 의 차이
- this.reset() 의 원리
- focus 관련한 내용
- JSON.stringify / JSON.parse
- localStorage 와 캐시의 차이
활용 사이트
https://courses.wesbos.com