๐Ÿ”‘JS | Local Storage ํ™œ์šฉํ•ด ๋ฉ”๋ชจ์žฅ ๋งŒ๋“ค๊ธฐ

์›์˜ยท2023๋…„ 4์›” 27์ผ
2

๋งŒ๋“ค์–ด๋ณด๊ธฐ๐Ÿคฉ

๋ชฉ๋ก ๋ณด๊ธฐ
3/4
post-thumbnail

๐Ÿ”Ž ์ €์žฅ, ์‚ญ์ œ, ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ์žฅ ๊ตฌํ˜„ํ•˜๊ธฐ

๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ
1. ์ œ๋ชฉ, ๋ฉ”๋ชจ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ธฐ
2. ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ ๋ฉ”๋ชจ๋“ค ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ธฐ
3. ์‚ญ์ œ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋ฉ”๋ชจ ์‚ญ์ œ
4. ์ˆ˜์ • ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋ฉ”๋ชจ ์ˆ˜์ •๊ฐ€๋Šฅ


๐Ÿ’ก1. ์ œ๋ชฉ, ๋ฉ”๋ชจ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ธฐ

  • ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— memos๋ผ๋Š” ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์คŒ
    memos์˜ ๊ฐ’์œผ๋กœ ๋ฉ”๋ชจ ๊ฐ์ฒด๋“ค์˜ ๋ฐฐ์—ด์„ ์ €์žฅ
  • ์ œ๋ชฉ, ๋ฉ”๋ชจ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด id์™€ ๋‚ ์งœ ์ƒ์„ฑํ•ด์„œ ๊ฐ์ฒด๋กœ ์ €์žฅํ•˜๊ณ , ์ด๊ฒƒ์„ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ memos ๋ฐฐ์—ด์— ์ถ”๊ฐ€
    id ๊ฐ’์ด ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์—†๋‹ค๋ฉด ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  0๋ถ€ํ„ฐ id ์„ค์ •
    id ๊ฐ’์€ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹˜! - ์‚ญ์ œ, ์ˆ˜์ •ํ•  ๋•Œ ๊ณ ์œ ๋ฒˆํ˜ธ๊ฐ€ ์žˆ์œผ๋ฉด ์‹๋ณ„ํ•˜๊ธฐ ์‰ฌ์šฐ๋‹ˆ๊นŒ ๊ทธ๊ฒƒ์„ ์œ„ํ•œ ์š”์†Œ๋กœ ๋„ฃ์–ด๋‘ 
const main = document.querySelector('.main');

// ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— memos๋ผ๋Š” ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์คŒ
let memos = JSON.parse(localStorage.getItem('memos'));
memos = memos ?? [];

memoBtn.addEventListener('click', function () {
  let newMemo = {};
  let memoTitle = main.querySelector('.memo-title').value;
  let memoContent = main.querySelector('.memo-content').value;
  
  // id ๊ฐ’์ด ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์—†๋‹ค๋ฉด ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  0๋ถ€ํ„ฐ id ์„ค์ •
  let id = JSON.parse(localStorage.getItem('id'));
  id = id ?? 0;
  
  // newMemo ๊ฐ์ฒด์— id, ์ œ๋ชฉ, ๋‚ด์šฉ, ๋‚ ์งœ ์ €์žฅ
  newMemo.id = id;
  newMemo.title = memoTitle;
  newMemo.content = memoContent;
  newMemo.date = `${now.getFullYear()}.${now.getMonth() + 1}.${now.getDate()}`;
  memos.push(newMemo);

  // ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— memos ํ‚ค๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๊ธฐ
  // ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— id ์ €์žฅํ•˜๊ธฐ
  localStorage.setItem('memos', JSON.stringify(memos));
  localStorage.setItem('id', JSON.stringify(++id));
  
  // setMemo() : 2๋ฒˆ์—์„œ ๋งŒ๋“ค ๋ฉ”๋ชจ๋“ค ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š” ํ•จ์ˆ˜
  setMemo();
  // ์ž…๋ ฅ์ฐฝ ๋น„์šฐ๊ธฐ
  main.querySelector('.memo-title').value = null;
  main.querySelector('.memo-content').value = null;
});

๐Ÿ’ก2. ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ ๋ฉ”๋ชจ๋“ค ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ธฐ

  • ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์—์„œ memos ๊ฐ’๋“ค ๊ฐ€์ ธ์™€์„œ DOM ํ™œ์šฉํ•ด ํ™”๋ฉด์— ์ตœ์‹ ์ˆœ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ
function setMemo() {
  const memo_list = main.querySelector('.memo-list');

  // ๊ธฐ์กด์˜ ๋ฉ”๋ชจ ์ œ๊ฑฐ
  while (memo_list.firstChild) {
    memo_list.firstChild.remove();
  }

  // ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋ฉ”๋ชจ ๊ฐ€์ ธ์™€์„œ ์ตœ์‹ ์ˆœ์œผ๋กœ ์ •๋ ฌ
  for (let i = memos.length - 1; i >= 0; i--) {
    // article
    let article = document.createElement('article');
    article.setAttribute('data-id', memos[i].id);
    
    // h2 : title
    let title = document.createElement('h2');
    title.textContent = memos[i].title;
    
    // span : date
    let data = document.createElement('span');
    data.textContent = memos[i].date;
    
    // p : content
    let content = document.createElement('p');
    content.textContent = memos[i].content;
    
    // button : delteBtn
    let deleteBtn = document.createElement('button');
    deleteBtn.textContent = '์‚ญ์ œ';
    // 3๋ฒˆ์—์„œ ๊ตฌํ˜„ํ•  ํ•ด๋‹น๋ฉ”๋ชจ ์‚ญ์ œ ํ•จ์ˆ˜ setEditBtn() ๋“ฑ๋กํ•ด์คŒ
    deleteBtn.addEventListener('click', setDeleteBtn, false);
    
    // button : edit
    let editBtn = document.createElement('button');
    editBtn.textContent = '์ˆ˜์ •';
    // 4๋ฒˆ์—์„œ ๊ตฌํ˜„ํ•  ํ•ด๋‹น๋ฉ”๋ชจ ์‚ญ์ œ ํ•จ์ˆ˜ setEditBtn() ๋“ฑ๋กํ•ด์คŒ
    editBtn.addEventListener('click', setEditBtn, false);
    
    article.append(title, data, content, editBtn, deleteBtn);
    memo_list.append(article);
  }
}

๐Ÿ’ก3. ์‚ญ์ œ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋ฉ”๋ชจ ์‚ญ์ œ

  • ์‚ญ์ œ ๋ฒ„ํŠผ ๋ˆ„๋ฅธ article์˜ dataset์— ์ €์žฅ๋œ id๋ฅผ memos์— ์ €์žฅ๋œ ๊ฐ’๋“ค์ด๋ž‘ ๋น„๊ต
    ์ผ์น˜ํ•˜๋Š” article ์‚ญ์ œ
// ๋ฉ”๋ชจ ์‚ญ์ œ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
function setDeleteBtn(e) {
  memos.forEach((a, i) => {
    // memos ๋ฐฐ์—ด์˜ id๋ฅผ ๋Œ๋ฉด์„œ ํด๋ฆญ๋œ ๊ฒƒ์˜ id์™€ ๋น„๊ต
    if (a.id == e.target.parentNode.dataset.id) {
      // ํด๋ฆญ๋œ ๋ฉ”๋ชจ ๋ฐฐ์—ด์—์„œ ์ž๋ฅด๊ธฐ
      memos.splice(i, 1);
      // ์ž๋ฅธ ๋ฉ”๋ชจ ๋ฐฐ์—ด ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ
      localStorage.setItem('memo', JSON.stringify(memos));
      // ์ƒˆ๋กœ ์ €์žฅ๋œ ๋ฉ”๋ชจ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ธฐ
      setMemo();
      return;
    }
  });
}

๐Ÿ’ก4. ์ˆ˜์ • ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋ฉ”๋ชจ ์ˆ˜์ •๊ฐ€๋Šฅ

  • 3๋ฒˆ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ˆ„๋ฅธ article์˜ dataset์— ์ €์žฅ๋œ id๋ฅผ memos์— ์ €์žฅ๋œ ๊ฐ’์ด๋ž‘ ๋น„๊ต
    ์ผ์น˜ํ•˜๋Š” article ๋ฉ”๋ชจ ํŒจ๋“œ์— ๊ฐ€์ ธ์˜ค๊ณ  ๋ฐฐ์—ด์—์„œ ์‚ญ์ œ
  • ์ˆ˜์ • ์™„๋ฃŒํ•˜๊ณ  ์ €์žฅํ•˜๋ฉด ์ƒˆ๋กœ ์ €์žฅํ•˜๋Š” ์‹œ์ ์˜ ๋‚ ์งœ๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ  ๊ฐ€์žฅ ์ตœ์‹ ์˜ ๋ฉ”๋ชจ๊ฐ€ ๋จ
// ๋ฉ”๋ชจ ์ˆ˜์ • ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
function setEditBtn(e) {
  memos.forEach((a, i) => {
    if (a.id == e.target.parentNode.dataset.id) {
      // ํด๋ฆญ๋œ ๋ฉ”๋ชจ์˜ ์ œ๋ชฉ, ๋‚ด์šฉ ๋ฉ”๋ชจ์žฅ ์“ฐ๋Š” ๊ณณ์— ๋‚˜ํƒ€๋ƒ„
      main.querySelector('.memo-title').value = a.title;
      main.querySelector('.memo-content').value = a.content;
      // ํด๋ฆญ๋œ ๋ฉ”๋ชจ ๋ฐฐ์—ด์—์„œ ์ž๋ฅด๊ธฐ
      memos.splice(i, 1);
      // ์ž๋ฅธ ๋ฉ”๋ชจ ๋ฐฐ์—ด ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ
      localStorage.setItem('memo', JSON.stringify(memos));
      // ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ธฐ
      setMemo();
      return;
    }
  });
}

๐ŸŽˆ๋‚˜๋งŒ์˜ ๋ฉ”๋ชจ์žฅ ๋งŒ๋“ค๊ธฐ

1. ์ €์žฅํ•˜๊ธฐ

2. ์‚ญ์ œํ•˜๊ธฐ

3. ์ˆ˜์ •ํ•˜๊ธฐ


๋ฐฐ๊ฒฝ ์ง์ ‘ ๊ทธ๋ ธ์–ด์š” ใ…Žใ…Ž ๊ท€์š”๋ฏธ ๋ฉ”๋ชจ์žฅ ์™„์„ฑ^ใ…^/

profile
ํ™”์ดํŒ…~~^ใ…^/

0๊ฐœ์˜ ๋Œ“๊ธ€