33_Notes App
๐ป์ฃผ์ : ๋งํฌ๋ค์ด ๊ธฐ๋ฅ์ด ์๋ ๋ฉ๋ชจ์ฅ
- ๋ฉ๋ชจ ์ถ๊ฐ
- ๋ฉ๋ชจ ์ ์ฅ(ํธ์ง)
- ๋ฉ๋ชจ ์ญ์
- ๋ฉ๋ชจ ๋ฐ์ดํฐ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๊ธฐ
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/5.1.0/marked.min.js" integrity="sha512-j5KAPeir0rGl+OSddiUeUtUlG+GK7acI/kNQqrpjSSB1IlDUbj3VnQOyoW3GWpPj7i8CSfb0T+Q4IRHxAPRxCA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
const addBtn = document.getElementById('add')
addBtn.addEventListener('click', () => addNewNote())
function addNewNote(text = '') {
const note = document.createElement('div')
note.classList.add('note')
note.innerHTML = `
<div class="tools">
<button class="edit"><i class="fas fa-edit"></i></button>
<button class="delete"><i class="fas fa-trash-alt"></i></button>
</div>
<div class="main ${text ? "" : "hidden"}"></div>
<textarea class="${text ? "hidden" : ""}"></textarea>
`
const editBtn = note.querySelector('.edit')
const deleteBtn = note.querySelector('.delete')
const main = note.querySelector('.main')
const textArea = note.querySelector('textarea')
textArea.value = text
main.innerHTML = marked(text)
deleteBtn.addEventListener('click', () => {
note.remove()
updateLS()
})
editBtn.addEventListener('click', () => {
main.classList.toggle('hidden')
textArea.classList.toggle('hidden')
})
textArea.addEventListener('input', (e) => {
const { value } = e.target
main.innerHTML = marked(value)
updateLS()
})
document.body.appendChild(note)
}
'add' ๋ฒํผ์ 'click' ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด addNewNote ํจ์๋ฅผ ํธ์ถํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋น ํ ์คํธ๋ก ํธ์ถ๋๋ค.
addNewNote ํจ์๋ ๋ ธํธ๋ฅผ ์์ฑํ๊ณ HTML ์์์ ์ถ๊ฐํ๋ค. ํ ์คํธ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น ํ ์คํธ๋ก ์ค์ ํ๋ค.
note ์์ ๋ด๋ถ์๋ ํธ์ง ๋ฒํผ(edit)๊ณผ ์ญ์ ๋ฒํผ(delete)์ด ์๋ค. ํ ์คํธ ์์ญ(textarea)๊ณผ ํ ์คํธ๋ฅผ ํ์ํ๋ ๋ฉ์ธ ์์ญ(main)๋ ์๋ค.
text๊ฐ ์์ผ๋ฉด ๊ทธ๋ฅ mainํด๋์ค, ์์ผ๋ฉด main hidden ํด๋์ค๋ก ๋ณ๊ฒฝ
deleteBtn์ ์ญ์ ๋ฒํผ์ด๋ค.
ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ๋
ธํธ๋ฅผ ์ ๊ฑฐํ๊ณ updateLS ํจ์๋ฅผ ํธ์ถํ์ฌ localStorage๋ฅผ ์
๋ฐ์ดํธํ๋ค.
editBtn์ ํธ์ง ๋ฒํผ์ด๋ค.
ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ฉ์ธ ์์ญ๊ณผ ํ
์คํธ ์์ญ์ ๊ฐ์์ฑ์ ํ ๊ธํ๋ค.
textArea๋ ํ
์คํธ ์์ญ์ด๋ค.
text ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ ํ
์คํธ๋ฅผ ์ค์ ํ๋ค.
textArea์ ์
๋ ฅ ์ด๋ฒคํธ์ ๋ํ ๋ฆฌ์ค๋.
(value๋ target ์์์ ์์ฑ ์ค ํ๋๋ก, ์ผ๋ฐ์ ์ผ๋ก input ์์๋ textarea ์์์ ๊ฐ์ ์ฌ์ฉ์ ์
๋ ฅ ๊ฐ์ ๋ํ๋ด๋ ์์ฑ)
ํ ์คํธ ์์ญ์ด ๋ณ๊ฒฝ๋๋ฉด ์ ๋ ฅ๋ ๊ฐ์ ๊ฐ์ ธ์ main ์์ญ์ ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ updateLS ํจ์๋ฅผ ํธ์ถํ์ฌ localStorage๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
const notes = JSON.parse(localStorage.getItem('notes'))
if(notes) {
notes.forEach(note => addNewNote(note))
}
function updateLS() {
const notesText = document.querySelectorAll('textarea')
const notes = []
notesText.forEach(note => notes.push(note.value))
localStorage.setItem('notes', JSON.stringify(notes))
}
localStorage๋ ์น ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ ์๊ตฌ์ ์ธ ๋ฐ์ดํฐ ์ ์ฅ์๋ค. ๋ฐ์ดํฐ๋ฅผ localStorage์ ์ ์ฅํ ๋๋ ํค-๊ฐ ์์ผ๋ก ์ ์ฅํ๋ฉฐ, ๊ฐ์ ๋ฌธ์์ด ํํ๋ก ์ ์ฅ๋๋ค.
JSON.parse()๋ JSON ํ์์ ๋ฌธ์์ด์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ๋ณํํ๋ ํจ์๋ค.
์์ ์ฝ๋์์ localStorage.getItem('notes')๋ localStorage์์ 'notes'๋ผ๋ ํค๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค. ์ด ๋ฐ์ดํฐ๋ ๋ฌธ์์ด ํํ๋ก ์ ์ฅ๋์ด ์์ผ๋ฏ๋ก, JSON.parse() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๋ฌธ์์ด์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ๋ณํํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก notes ๋ณ์์๋ 'notes' ํค๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด ํํ๋ก ๊ฐ์ ธ์จ ๊ฐ์ด ํ ๋น๋๋ค. ์ด๋ฅผ ํตํด ์ด์ ์ ์ ์ฅ๋ ๋ ธํธ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ํ์ฌ ํ๋ฉด์ ํ์ํ๊ฒ ๋ฉ๋๋ค.
notes ๋ฐฐ์ด์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ, ๊ฐ ๋ ธํธ์ ๋ํด addNewNote ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ ธํธ๋ฅผ ์ถ๊ฐํ๋ค.
notes ๋ฐฐ์ด์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ localStorage์์ 'notes'๋ผ๋ ํค๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ, ํด๋น ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ง์ฝ ์ด์ ์ ๋
ธํธ๋ฅผ ์์ฑํ์ฌ localStorage์ 'notes'๋ผ๋ ํค๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ, notes ๋ฐฐ์ด์ ํด๋น ๋ฐ์ดํฐ๊ฐ ํ ๋น๋๋ค. ์ด๋ notes ๋ฐฐ์ด์ ์ด์ ์ ์์ฑํ ๋
ธํธ๋ค์ ํ
์คํธ๋ฅผ ๋ด๊ณ ์๋ค.
updateLS ํจ์๋ textarea ์์๋ค์ ๋ชจ๋ ์ ํํ์ฌ ํด๋น ๊ฐ๋ค์ ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
์ด ๋ฐฐ์ด์ JSON ํ์์ผ๋ก ๋ณํํ์ฌ 'notes'๋ผ๋ ํค๋ก localStorage์ ์ ์ฅํ๋ค.
๐๐ป์์ ์ด๋ฏธ์ง์ฒ๋ผ ๋
ธํธ ์์ฑ ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ๋ฉ๋ชจ์ ๋ํ ๋ฐ์ดํฐ๋ค์ด ๋ฐฐ์ด๋ก ์ ์ฅ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์์.