λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
[개발] Practice/React

[React] localStorage 둜 DB 없이 데이터 μ €μž₯ν•˜κΈ°

by Connecting-the-dots 2022. 3. 31.
728x90
λ°˜μ‘ν˜•

πŸ’‘ μ‹€μŠ΅ 포인트!

  • κ°•μ‚¬λ‹˜μ˜ localStorage μˆ˜μ—…μ„ 듀은 후에, "졜근 λ³Έ μƒν’ˆ" κΈ°λŠ₯을 λ§Œλ“œλŠ” κ°€μ΄λ“œλ₯Ό ν™œμš©ν•˜μ—¬ λ‚΄κ°€ μƒκ°ν•œ λŒ€λ‘œ "졜근 λ³Έ μƒν’ˆ" UI λ₯Ό λ§Œλ“€κ³  κΈ°λŠ₯을 κ΅¬ν˜„ν•΄λ³΄μ•˜λ‹€.
  • 처음 이 κΈ°λŠ₯을 λ§Œλ“€ λ•Œλ§Œ 해도 λ§‰λ§‰ν–ˆλŠ”λ°, μ—λŸ¬μ½”λ“œλ₯Ό 읽어가며 μ•„μ‰¬μš΄ 뢀뢄을 ν•˜λ‚˜ν•˜λ‚˜ μΆ”κ°€, μˆ˜μ •ν•΄λ‚˜κ°€λ‹€λ³΄λ‹ˆ μ–΄λŠλ§ κ½€ κ·ΈλŸ΄μ‹Έν•œ ν˜•νƒœλ‘œ λ§Œλ“€μ–΄μ‘Œλ‹€.

πŸ’œ localStorage μ‚¬μš©λ²• μ•Œμ•„λ³΄κΈ°

  • μƒˆλ‘œκ³ μΉ¨μ„ ν•˜λ©΄ JS νŒŒμΌλ“€μ„ λͺ¨λ‘ μ²˜μŒλΆ€ν„° λ‹€μ‹œ 읽어듀이기 λ•Œλ¬Έμ— λ‹Ήμ—°ν•˜κ²Œλ„ λͺ¨λ“  state 의 λ°μ΄ν„°λŠ” μ΄ˆκΈ°ν™”λœλ‹€.
  • μ΄λ ‡κ²Œ state 에 μ €μž₯된 데이터가 μ΄ˆκΈ°ν™”λ˜λŠ” 것이 μ‹«λ‹€λ©΄ λͺ¨λ‘ DB 에 μ €μž₯ν•˜λ©΄ λ˜λŠ”λ°, λ§Œμ•½ λ³„λ„μ˜ μ„œλ²„λ‚˜ DB 지식이 μ—†λ‹€λ©΄ localStorage 에 μ €μž₯ν•˜λŠ” 방법이 μžˆλ‹€.
  • localStorage λŠ” λΈŒλΌμš°μ €μ— λͺ°λž˜ 정보λ₯Ό μ €μž₯ν•  λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” 곡간이닀.

🀍 localStorage 찾아보기

  • Chrome κ°œλ°œμžλ„κ΅¬μ—μ„œ Application 탭에 λ“€μ–΄κ°€λ©΄ 쒌츑 Storage ν•˜μœ„ λͺ©λ‘μΈ Local Storage λ₯Ό 확인할 수 μžˆλ‹€.
  • 각 μ‚¬μ΄νŠΈλ§ˆλ‹€ 5MB μ •λ„μ˜ ν…μŠ€νŠΈ, 숫자 데이터λ₯Ό μ €μž₯ν•  수 있으며 μ‚¬μš©μžκ°€ λΈŒλΌμš°μ € μ²­μ†Œλ₯Ό ν•˜μ§€ μ•ŠλŠ” 이상은 영ꡬ적으둜 λ‚¨μ•„μžˆλ‹€.

🀍 localStorage 문법 μ•Œμ•„λ³΄κΈ°

// 데이터 μΆ”κ°€
localStorage.setItem('데이터이름', '데이터');

// 데이터 쑰회
localStorage.getItem('데이터이름');

// 데이터 μ‚­μ œ
localStorage.removeItem('데이터이름');
  • JavaScript 파일 μ–΄λ””μ„œλ“  μœ„μ™€ 같은 문법을 μ‚¬μš©ν•˜λ©΄ 데이터 μž…μΆœλ ₯이 κ°€λŠ₯ν•˜λ‹€.
  • 데이터λ₯Ό μΆ”κ°€ν•  λ•Œμ—λŠ” object μžλ£Œν˜•μ²˜λŸΌ key:value 의 ν˜•νƒœλ‘œ 데이터가 μ €μž₯λœλ‹€.
  • μ œλŒ€λ‘œ μ €μž₯이 λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κ³  μ‹Άλ‹€λ©΄ Application νƒ­μ˜ localStorage μ—μ„œ ν™•μΈν•˜λ©΄ λœλ‹€.

🀍 localStorage 에 object / array μ €μž₯ν•˜κΈ°

localStorage.setItem('obj', JSON.stringify({name:'Seoyun'}) );
  • localStorage λŠ” μˆœμ „νžˆ ν…μŠ€νŠΈ μžλ£Œν˜•λ§Œ μ €μž₯이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ—, object μžλ£Œν˜•μ΄λ‚˜ array μžλ£Œν˜•μ€ λ°”λ‘œ μ €μž₯ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•˜λ‹€.
  • ν•˜μ§€λ§Œ κΌ­ object μžλ£Œν˜• ν˜Ήμ€ array μžλ£Œν˜•μ„ μ €μž₯ν•΄μ•Ό ν•œλ‹€λ©΄, ν…μŠ€νŠΈ 자료둜 인식할 수 μžˆλ„λ‘ λ”°μ˜΄ν‘œλ₯Ό μ³μ„œ JSON 의 ν˜•νƒœλ‘œ λ°”κΏ”μ€€ 뒀에 μ €μž₯ν•˜λ©΄ λœλ‹€.
  • 맀번 λ”°μ˜΄ν‘œλ₯Ό λΆ™μ—¬μ£ΌλŠ” 것은 번거둭기 λ•Œλ¬Έμ— JSON.stringify() λΌλŠ” ν•¨μˆ˜ μ•ˆμ— object μžλ£Œν˜•μ΄λ‚˜ array μžλ£Œν˜•μ„ λ„£μ–΄μ£Όλ©΄ μ‰½κ²Œ JSON ν˜•νƒœλ‘œ λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€.

  • 이제 μœ„μ™€ 같이 localStorage 에 { "name" : "Seoyun" } μ΄λΌλŠ” ν˜•νƒœλ‘œ μ €μž₯된 것을 λ³Ό 수 μžˆλ‹€.

🀍 localStorage 에 μ €μž₯된 object / array κΊΌλ‚΄μ–΄ μ‚¬μš©ν•˜κΈ°

  • μ΄λ ‡κ²Œ localStorage 에 μ €μž₯된 λ°μ΄ν„°λŠ” λ‹€μ‹œ κΊΌλƒˆμ„ λ•Œ JSON 의 ν˜•νƒœ κ·ΈλŒ€λ‘œ λ‚˜μ˜€κΈ° λ•Œλ¬Έμ— object μžλ£Œν˜•μ΄λ‚˜ array μžλ£Œν˜•μ²˜λŸΌ 데이터λ₯Ό μ‘°μž‘ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•˜λ‹€.
  • λ”°λΌμ„œ, 이런 JSON ν˜•νƒœμ˜ 데이터λ₯Ό λ‹€μ‹œ object μžλ£Œν˜• ν˜Ήμ€ array μžλ£Œν˜•μœΌλ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” 과정이 ν•„μš”ν•œλ° 이 λ•Œ JSON.parse() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

πŸ’œ 졜근 λ³Έ μƒν’ˆ UI 및 κΈ°λŠ₯ λ§Œλ“€κΈ°

  • μ‡Όν•‘λͺ° 같은 곳을 보면 졜근 λ³Έ μƒν’ˆμ΄λΌκ³  ν•΄μ„œ νŠΉμ • μœ„μΉ˜μ— μ‚¬μš©μžκ°€ 이제껏 λ³Έ μƒν’ˆλ“€μ„ λ„μ›Œμ£ΌλŠ” κ²½μš°κ°€ μžˆλ‹€.
  • 이번 μˆ˜μ—…μ—μ„œ 배운 localStorage λ₯Ό ν™œμš©ν•΄μ„œ 이런 졜근 λ³Έ μƒν’ˆ UI 와 κΈ°λŠ₯을 λ§Œλ“€μ–΄λ³΄μ•˜λ‹€.

🀍 졜근 λ³Έ μƒν’ˆλ“€μ„ μˆœμ„œλŒ€λ‘œ localStorage 에 μ €μž₯ν•˜κΈ°

  • κ°•μ‚¬λ‹˜μ˜ μ½”λ“œλ„ μ’‹μ•˜μ§€λ§Œ λ‚΄κ°€ μƒκ°ν•˜λŠ” λ°©μ‹κ³ΌλŠ” 쑰금 λ‹¬λΌμ„œ λ‚˜λŠ” λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€.
  • λ‚΄κ°€ μƒκ°ν•œ 방식은 λ‹€μŒκ³Ό κ°™λ‹€.
    • 일단 졜근 λ³Έ μƒν’ˆμ€ μ€‘λ³΅λ˜λŠ” μƒν’ˆ 없이 μ„Έλ‘œ μ •λ ¬ν•˜μ—¬ λ”± 3개만 보여쀀닀.
    • 졜근 λ³Έ μƒν’ˆμ˜ μˆœμ„œλŠ” 맨 μœ„μ— 제일 μ΅œκ·Όμ— λ³Έ μƒν’ˆμ΄ 였게 ν•œλ‹€.
    • λ§Œμ•½ λ³΄μ•˜λ˜ μƒν’ˆμ„ λ‹€μ‹œ 보게 λœλ‹€λ©΄ 제일 μ΅œκ·Όμ— λ³Έ 기둝 κΈ°μ€€μœΌλ‘œ 쀑볡 μ²΄ν¬ν•˜μ—¬, ν•œ 번만 졜근 λ³Έ μƒν’ˆμ— ν‘œμ‹œν•œλ‹€.
      (Set ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 제일 νŽΈν•œλ°, 이 ν•¨μˆ˜λŠ” 쀑볡인 경우 μ•ž μˆœμ„œμ˜ 기둝을 남기고 λ’· μˆœμ„œ 기둝을 μ‚­μ œν•΄λ²„λ¦¬λ―€λ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 데에 고민을 μ’€ 많이 ν–ˆλ‹€.)
// 전체 μ½”λ“œ 미리보기

useEffect(()=>{
    if (localStorage.watched === undefined ) {
      localStorage.setItem('watched', JSON.stringify([]));
    }
    let watched = JSON.parse(localStorage.getItem('watched'));
    watched.unshift(id);
    watched = [...new Set(watched)].slice(0,3);
    localStorage.setItem('watched', JSON.stringify(watched));
}, [])
  • μ‚¬μš©μžκ°€ νŠΉμ • μƒν’ˆμ„ ν΄λ¦­ν•˜μ—¬ 상세 νŽ˜μ΄μ§€λ‘œ μ ‘μ†ν•˜λ©΄, κ·Έ 상세 νŽ˜μ΄μ§€ λ‚΄μ˜ μƒν’ˆμ΄ localStorage 에 μ €μž₯λ˜μ–΄μ•Ό ν•œλ‹€.
  • λ”°λΌμ„œ Detail Component κ°€ μƒμ„±λ˜μžλ§ˆμž 기둝할 수 있게 useEffect() 에 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όμ—ˆλ‹€.
  • λ¨Όμ €, 졜근 λ³Έ μƒν’ˆλ“€μ΄ 무엇인지 κΈ°λ‘ν•˜λŠ” κΈ°λŠ₯이 ν•„μš”ν•œλ°, λ‚˜λŠ” watched λΌλŠ” λ³€μˆ˜λͺ…μœΌλ‘œ localStorage 에 array ν˜•μ‹μœΌλ‘œ κΈ°λ‘ν•΄μ£ΌκΈ°λ‘œ ν–ˆλ‹€.

 

if (localStorage.watched === undefined ) {
  localStorage.setItem('watched', JSON.stringify([]));
}
  • 이 λ•Œ, 생각해야 ν•  것은 처음 μƒν’ˆμ„ ν΄λ¦­ν•˜μ—¬ 상세 νŽ˜μ΄μ§€μ— μ ‘μ†ν•˜λŠ” κ²½μš°μ—λŠ” localStorage 에 watched λΌλŠ” array κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ(undefined μƒνƒœμ— ν•΄λ‹Ή) μš°μ„  λΉ„μ–΄μžˆλŠ” watched λΌλŠ” array λ₯Ό λ§Œλ“€μ–΄μ£Όμ–΄μ•Ό ν•œλ‹€λŠ” 것이닀.

 

let watched = JSON.parse(localStorage.getItem('watched'));
watched.unshift(id);
watched = [...new Set(watched)].slice(0,3);
localStorage.setItem('watched', JSON.stringify(watched));
  • κ·Έλ ‡λ‹€λ©΄ 이전에 μƒν’ˆμ„ ν΄λ¦­ν•˜μ—¬ 상세 νŽ˜μ΄μ§€μ— μ ‘μ†ν•œ 적이 μžˆλ‹€λ©΄?
  • 그러면 μ§€κΈˆ 상세 νŽ˜μ΄μ§€μ˜ url 의 id νŒŒλΌλ―Έν„°λ₯Ό watched λΌλŠ” array 에 μΆ”κ°€ν•΄μ£Όλ©΄ λœλ‹€.
  • λ‚˜λŠ” μ΅œμ‹ μˆœμœΌλ‘œ μ •λ ¬ν•œ 후에 쀑볡을 μ œκ±°ν•˜κ³  μ„Έ 개λ₯Ό 뽑아 μœ„μ—μ„œλΆ€ν„° μ΅œμ‹ μˆœμœΌλ‘œ μ •λ ¬ν•  거라 μœ„μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όμ—ˆλ‹€.
    ( push() ν•¨μˆ˜μ— κ½‚ν˜€μ„œ array λ₯Ό 뒀집어야 ν•˜λ‚˜ Set() ν•¨μˆ˜ 말고 λ‹€λ₯Έ 방법을 μ°Ύμ•„μ„œ 쀑볡을 ν•΄μ•Όν•˜λ‚˜ 고민이 κΈΈμ–΄μ‘Œλ‹€....unshift() μ¨μ„œ κ·Έλƒ₯ μ΅œκ·Όμ— λ³Έ μƒν’ˆμ„ watched 맨 μ•žλΆ€λΆ„μ— λΌμ›Œμ£Όλ©΄ λ˜λŠ” 것을...)
  • id λŠ” 이전에 usePrams() λ₯Ό μ‚¬μš©ν•œ 적이 μžˆμœΌλ―€λ‘œ κ·ΈλŒ€λ‘œ μž¬ν™œμš©ν–ˆλ‹€.  
  • μœ„ μ½”λ“œλ₯Ό ν•΄μ„ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.
    • localStorage 에 μ €μž₯된 watched λ₯Ό 닀루기 μœ„ν•΄ JSON.parse() λ₯Ό μ‚¬μš©ν•˜μ—¬ array ν˜•νƒœλ‘œ λ§Œλ“  ν›„ watched λΌλŠ” λ³€μˆ˜λͺ…μœΌλ‘œ μ €μž₯ν•œλ‹€.
    • μƒν’ˆμ„ ν΄λ¦­ν•΄μ„œ 상세 νŽ˜μ΄μ§€μ— 접속할 λ•Œλ§ˆλ‹€, μ΅œμ‹ μˆœμœΌλ‘œ μ €μž₯될 수 μžˆλ„λ‘ ν•΄λ‹Ή νŽ˜μ΄μ§€μ˜ μƒν’ˆ id λ₯Ό watched array 의 맨 μ•žμœΌλ‘œ λ„£λŠ”λ‹€.
    • 쀑볡을 μ œκ±°ν•˜κΈ° μœ„ν•΄ new Set() 에 λ‹΄κ³  spread λ¬Έλ²•μœΌλ‘œ κ΄„ν˜Έλ₯Ό 벗겨쀀 λ‹€μŒ, slice() λ₯Ό μ‚¬μš©ν•˜μ—¬ 3개만 watched 에 μ €μž₯ν•œλ‹€.
    • μ €μž₯ν•œ watched λ₯Ό JSON.stringify() ν•˜μ—¬ JSON μƒνƒœλ‘œ λ§Œλ“  λ‹€μŒ localStorage 에 μ €μž₯ν•΄μ€€λ‹€.

🀍 졜근 λ³Έ μƒν’ˆ UI λ§Œλ“€κΈ°

  • 졜근 λ³Έ μƒν’ˆ UI κ°€ 메인 νŽ˜μ΄μ§€, 상세 νŽ˜μ΄μ§€, μž₯λ°”κ΅¬λ‹ˆ νŽ˜μ΄μ§€μ—μ„œ λͺ¨λ‘ λ³΄μ˜€μœΌλ©΄ ν•΄μ„œ, μ•„μ˜ˆ Watched λΌλŠ” μ΄λ¦„μ˜ Component 둜 λ§Œλ“€μ–΄μ£Όμ—ˆλ‹€.
  • 그리고 UI λ””μžμΈμ„ μ΄λ²ˆμ—λŠ” styled-components 라이브러리λ₯Ό μ΄μš©ν•˜μ§€ μ•Šκ³ , scss νŒŒμΌμ„ λ§Œλ“€μ–΄μ„œ μ§„ν–‰ν–ˆλ‹€.

  • λŒ€λž΅μ μœΌλ‘œ λ””μžμΈν•˜λŠ” 과정을 미리 λ³΄λ©΄μ„œ μ§„ν–‰ν•˜κ³  μ‹Άμ–΄μ„œ Watched.js, Watched.scss νŒŒμΌμ„ λ§Œλ“  후에 App.js 에 import ν•œ ν›„ λΌμš°νŒ…μ„ ν•˜μ—¬ ν•΄λ‹Ή url μ—μ„œ ν•˜λ“œμ½”λ”©λΆ€ν„° μ§„ν–‰ν•΄λ³΄μ•˜λ‹€.

🀍 Watched Component λ₯Ό 메인 νŽ˜μ΄μ§€μ— import ν•˜κΈ°

  • 이 κ³Όμ • μ—­μ‹œ ν—˜λ‚œν–ˆλ‹€... 
  • κΈ°μ‘΄μ—λŠ” Data.js 에 3개의 λ°μ΄ν„°λ§Œ 있고 axios λ₯Ό μ΄μš©ν•˜μ—¬ λΆˆλŸ¬μ™”μ—ˆλŠ”λ°, μ™œμΈμ§€ 아무리 λΆˆλŸ¬μ™€λ„ λ¬΄ν•œλ‘œλ”©μ²˜λŸΌ μž‘λ™μ„ μ’€ μ΄μƒν•˜κ²Œ ν•˜κΈ°μ— κ·Έλƒ₯ 데이터 전체λ₯Ό Data.js νŒŒμΌμ— λ„£μ–΄μ£Όμ—ˆλ‹€.
let [shoes, setShoes] = useState(Data.slice(0,3));
  • 이둜 인해 기쑴의 κΈ°λŠ₯에 λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ shoes λΌλŠ” state κ°€ Data.js νŒŒμΌμ—μ„œ 데이터λ₯Ό 3개만 κ°€μ Έμ˜€λ„λ‘ μˆ˜μ •μ„ ν•΄μ£Όμ—ˆλ‹€.

 

// shoesAll state 생성

let [shoesAll, setShoesAll] = useState(Data);


// Main Component 둜 shoesAll, setShoesAll state 전솑

<Route exact path='/'>
  <Main shoes={shoes} setShoes={setShoes} shoesAll={shoesAll} setShoesAll={setShoesAll}/>
</Route>
  • 그리고 shoesAll μ΄λΌλŠ” state λ₯Ό App.js νŒŒμΌμ— λ§Œλ“€μ–΄μ„œ shoesAll, setShoesAll λͺ¨λ‘ Main Component 둜 μ „μ†‘ν•΄μ£Όμ—ˆλ‹€.

 

<Watched shoesAll={props.shoesAll} setShoesAll={props.setShoesAll}/>
  • 이제 Main.js 파일의 μ λ‹Ήν•œ μœ„μΉ˜μ— Watched Component λ₯Ό λ„£μ–΄μ£Όλ©΄ λœλ‹€.
  • 이 λ•Œ, props 둜 λ°›μ•„μ˜¨ shoesAll κ³Ό setShoesAll 을 Watched.js 에 μžˆλŠ” Watched Component μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ‹€μ‹œ 전솑을 ν•΄μ£Όμ—ˆλ‹€.

🀍 Watched Component 에 λ°μ΄ν„°λ°”μΈλ”©ν•˜κΈ°

// 전체 μ½”λ“œ 미리보기

function Watched (props) {

    let watchedAll = JSON.parse(localStorage.getItem('watched'));
    let findWatched = [];
    if (watchedAll !== null){
        for(let i = 0; i < watchedAll.length; i++) {
            findWatched.push(props.shoesAll.find(function(item) {
                return item.id === parseInt(watchedAll[i]);
            }));
        }
    }

    let history = useHistory();

    return (
        <div className='watched'>
            <p className='item'>졜근 λ³Έ μƒν’ˆ</p>
            {
                findWatched.map((watched, idx)=>{
                    return (
                        <div className="watched-item" key={idx} onClick={()=>{ history.push(`/detail/${watched.id}`) }}>
                            <img src={`https://codingapple1.github.io/shop/shoes${watched.id + 1}.jpg`} alt="item" />
                            <p className='name'>{watched.title}</p>
                        </div>
                    )
                })
            }

        </div>
    )
}
  • λ‹€μ–‘ν•œ 반볡문 μ‚¬μš©μ— 적응이 ν•„μš”ν•΄μ„œ, for 반볡문과 map() ν•¨μˆ˜ λ‘˜ λ‹€ μ‚¬μš©ν•˜μ—¬ 데이터바인딩을 ν•΄λ³΄μ•˜λ‹€.
  • 이전에 상세 νŽ˜μ΄μ§€μ—μ„œλŠ” κΈ°μ‘΄ λ°μ΄ν„°μ˜ id 와 url νŒŒλΌλ―Έν„°μ— ν•΄λ‹Ήν•˜λŠ” id λ₯Ό λΉ„κ΅ν•˜μ—¬ ν•˜λ‚˜λ§Œ 데이터λ₯Ό μ°Ύμ•„μ˜€λŠ” κ²ƒμ΄μ—ˆλ‹€.
  • μ΄λ²ˆμ—λŠ” μœ μ‚¬ν•˜μ§€λ§Œ μΌμΉ˜ν•˜λŠ” id 의 데이터λ₯Ό μ΅œλŒ€ 3개λ₯Ό μ°Ύμ•„μ™€μ•Όν–ˆκΈ°μ—, μ°Ύμ•„λ‚Έ object ν˜•μ‹μ˜ 데이터듀을 findWatched λΌλŠ” 배열을 λ§Œλ“€μ–΄μ„œ λ„£μ–΄μ£ΌκΈ°λ‘œ ν–ˆλ‹€.
  • 그리고 κ·Έ 찾은 데이터λ₯Ό map() 을 톡해 λ°μ΄ν„°λ°”μΈλ”©κΉŒμ§€ ν•΄μ£Όλ©΄ μ™„λ£Œ!

 

    let watchedAll = JSON.parse(localStorage.getItem('watched'));
    let findWatched = [];
    if (watchedAll !== null){
        for(let i = 0; i < watchedAll.length; i++) {
            findWatched.push(props.shoesAll.find(function(item) {
                return item.id === parseInt(watchedAll[i]);
            }));
        }
    }
  • λ¨Όμ € μœ„ μ½”λ“œλΆ€ν„° ν•΄μ„ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.
    • localStorage 에 μ €μž₯된 watched λΌλŠ” array λ₯Ό 데이터 μ‘°μž‘μ΄ κ°€λŠ₯ν•˜λ„λ‘ JSON.parse() ν•˜μ—¬ λ°›μ•„μ˜¨ λ‹€μŒ watchedAll μ΄λΌλŠ” λ³€μˆ˜λͺ…μœΌλ‘œ μ €μž₯ν•œλ‹€.
    • 이제 watched 에 λ‹΄κ²¨μžˆλŠ” id λ₯Ό μ˜λ―Έν•˜λŠ” μš”μ†Œλ“€κ³Ό κΈ°μ‘΄ λ°μ΄ν„°μ˜ id λ₯Ό λΉ„κ΅ν•˜μ—¬ μΌμΉ˜ν•˜λŠ” κ²ƒλ§Œ 담을 findWatched λΌλŠ” 빈 array λ₯Ό λ§Œλ“ λ‹€.
    • watchedAll 이 λΉ„μ–΄μžˆλŠ” 경우 생길 였λ₯˜κ°€ μƒκΈ°λ―€λ‘œ null 값이 아닐 λ•Œμ—λ§Œ for λ°˜λ³΅λ¬Έμ„ λŒλ €μ€€λ‹€.
    • props 둜 λ°›μ•„μ˜¨ shoesAll μ΄λΌλŠ” state μš”μ†Œμ˜ id 와 watchedAll[0], watchedAll[1]... 의 문자λ₯Ό 숫자둜 λ³€ν™˜ν•œ 값을 λΉ„κ΅ν•˜μ—¬ μΌμΉ˜ν•˜λŠ” κ²ƒλ§Œ findWatched 에 push() ν•¨μˆ˜λ‘œ μΆ”κ°€ν•΄μ€€λ‹€.

 

function Watched (props) {

    let history = useHistory();

    return (
        <div className='watched'>
            <p className='item'>졜근 λ³Έ μƒν’ˆ</p>
            {
                findWatched.map((watched, idx)=>{
                    return (
                        <div className="watched-item" key={idx} onClick={()=>{ history.push(`/detail/${watched.id}`) }}>
                            <img src={`https://codingapple1.github.io/shop/shoes${watched.id + 1}.jpg`} alt="item" />
                            <p className='name'>{watched.title}</p>
                        </div>
                    )
                })
            }

        </div>
    )
}
  • 이제 findWatched 에 μ €μž₯된 데이터λ₯Ό 가지고 map() ν•¨μˆ˜λ‘œ λ°˜λ³΅λ¬Έμ„ 돌렀 ν•„μš”ν•œ μœ„μΉ˜μ— 데이터바인딩을 ν•΄μ€€λ‹€.
  • 이 λ•Œ onClick 속성을 μΆ”κ°€ν•˜μ—¬ useHistory() κΈ°λŠ₯을 λ„£μ–΄μ£Όμ—ˆλ‹€.
  • κ·Έλž˜μ„œ 졜근 λ³Έ μƒν’ˆμ˜ ν•΄λ‹Ή 이미지 및 μƒν’ˆλͺ…을 ν΄λ¦­ν•˜λ©΄ 상세 νŽ˜μ΄μ§€λ‘œ λ°”λ‘œ 이동할 수 있게 λ˜μ—ˆλ‹€.

 

728x90
λ°˜μ‘ν˜•