[๐Ÿ’ป ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  FE 44๊ธฐ] ์†”๋กœ ํ”„๋กœ์ ํŠธ - 4 (๋ฉ”์ธ ํ™”๋ฉด, ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„)

JiEunยท2023๋…„ 5์›” 17์ผ
0

โœ”๏ธ์‹œ์ž‘

๋“œ๋””์–ด ํ’€๋ฆฌ์ง€ ์•Š์•˜๋˜ localStorage์™€ ๊ด€๋ จ๋œ ๋ถ๋งˆํฌ ์˜์—ญ์„ ํ•ด๊ฒฐํ–ˆ๋‹ค..
ํŽ˜์–ด๋ถ„์ด ์•„๋‹ˆ์…จ๋‹ค๋ฉด ์•„๋งˆ ๋‚˜๋Š”... ใ… ..


๐Ÿ“์ž‘์—… ํ˜„ํ™ฉ

โœ”๏ธ ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ

๐Ÿค” ๋ถ๋งˆํฌ ํด๋ฆญ ์‹œ localStorage์— ์ถ”๊ฐ€๋Š” ๋˜์ง€๋งŒ ์ƒˆ๋กœ๊ณ ์นจ ํ›„ ๋‹ค๋ฅธ ์ƒํ’ˆ ํด๋ฆญ ์‹œ ๊ธฐ์กด ์ƒํ’ˆ ์ดˆ๊ธฐํ™” ํ›„ ์ถ”๊ฐ€๋˜๋Š” ์ด์Šˆ

์ด์ „ ์ฝ”๋“œ

const [isBookMark, setIsBookMark] = useState(false)
const [dataState, setDataState] = useState([])
const BOOKMARK = "BOOKMARK"

const storedData = JSON.parse(localStorage.getItem(BOOKMARK));
  
const handleBookmarkToggle = (item) => {
    if (dataState.includes(item) || storedData.includes(item)) {
      const filterData = dataState.filter(el => el.id !== item.id)
      setDataState(filterData)
      localStorage.setItem(BOOKMARK, JSON.stringify(filterData))
    } else {
      setDataState([...dataState, item])
      localStorage.setItem(BOOKMARK, JSON.stringify([...dataState, item]))
    }
  }

๊ทธ ๋•Œ ํŽ˜์–ด ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ ํ–ˆ๋Š”๋ฐ
ํŽ˜์–ด๋‹˜์ด ๋งŽ์€ ๋„์›€์„ ์ฃผ์…จ๋‹ค.

ํ˜„์žฌ dataState๊ฐ€ ์ดˆ๊ธฐ ์ƒํƒœ๊ฐ€ ๋นˆ ๋ฐฐ์—ด์ธ๋ฐ ์ƒˆ๋กœ๊ณ ์นจ ํ•  ๋•Œ ๋งˆ๋‹ค ๋นˆ ๋ฐฐ์—ด์ด ๋˜์–ด์„œ ๊ทธ๋Ÿฐ๊ฑฐ ๊ฐ™๋‹ค๊ณ  ๋ง์”€ํ•ด ์ฃผ์…จ๋‹ค.

๐Ÿ› ๏ธ ์ˆ˜์ •ํ•œ ์ฝ”๋“œ ์ฝ”๋“œ

 const handleBookmarkToggle = (item) => {
    if (dataState.includes(item) || storedData.includes(item)) {
      const filterData = dataState.filter(el => el.id !== item.id)
      setDataState([...filterData])
      localStorage.setItem(BOOKMARK, JSON.stringify([...filterData]))
    } else {
      setDataState([item, ...storedData])
      localStorage.setItem(BOOKMARK, JSON.stringify([item, ...storedData]))
    }
  }
setDataState([...dataState, item])
localStorage.setItem(BOOKMARK, JSON.stringify([...dataState, item]))

ํ•ด๋‹น ๋ถ€๋ถ„์˜ [...dataState, item]๋ฅผ [item, ...storedData]๋กœ ๋ณ€๊ฒฝํ•ด ์ฃผ์—ˆ๋”๋‹ˆ ์ž˜ ๋˜์—ˆ๋‹ค!

์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” item์„ ๋งจ ์ฒ˜์Œ ๋…ธ์ถœํ•˜๊ฒŒ ํ•˜๊ณ  localStorage์— ์ €์žฅํ•œ ๊ฐ’์„
๋’ค์— ๋ฐฐ์น˜ํ–ˆ๋‹ค. ์™œ storedData์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ์ƒ๊ฐ์„ ์•ˆ ํ–ˆ์„๊นŒ..?

ํŽ˜์–ด๋‹˜ ๋•๋ถ„์— ์ž‘์—… ์‹œ๊ฐ„ ๋‹จ์ถ•์ด ๋งŽ์ด ๋˜์—ˆ๋‹ค!

๐Ÿค” ๋ถ๋งˆํฌ ํด๋ฆญ ์‹œ ๋ฒ„ํŠผ ์Šคํƒ€์ผ์ด ๋ณ€๊ฒฝํ•˜๋Š”๊ฑธ boolean์œผ๋กœ ๊ตฌ๋ถ„ ์ง€์—ˆ์ง€๋งŒ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์Šˆ

๋ถ๋งˆํฌ ํด๋ฆญ ์‹œ ์ƒํ’ˆ์€ ์ž˜ ๋“ค์–ด์˜ค๋Š”๋ฐ ๋ฒ„ํŠผ ์Šคํƒ€์ผ์ด ์ž๊พธ ์ด์ƒํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค..ใ… 
(๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๊ธฐ์กด props๋“ค์€ ์ง€์› ๋‹ค.)

const [isBookMark, setIsBookMark] = useState(false)
.
.
.
{productItem.slice(0,4).map((el) => {
return (
  <CardItem
    isBookMark={isBookMark}
  >
);

4๊ฐœ์˜ ์ƒํ’ˆ๋งŒ ๋ณด์—ฌ์•ผํ•˜๊ธฐ์— slice๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ  ๋ถ๋งˆํฌ๋Š” useState๋กœ ๋ชจ๋‹ฌ์ฐฝ๊ณผ ๋™์ผํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

์ด๋ฏธ ์ž‘์—…์ด ๋๋‚˜๊ณ  ๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๊ฑฐ๋ผ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰ํ–ˆ๋Š”์ง€ ๊ธฐ์–ต์ด ๊ฐ€๋ฌผ๊ฐ€๋ฌผํ•˜์ง€๋งŒ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋‚˜ filter๋ฅผ ์‚ฌ์šฉํ•ด localStorage์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ ์œ ๋ฌด์— ๋”ฐ๋ผ boolean ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ–ˆ์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ž๊พธ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œ ์™œ์ง€? ์‹ถ์—ˆ๊ณ  ๊ทธ ๋•Œ some์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์•Œ๊ฒŒ ๋˜์–ด ์ˆ˜์ •ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๐Ÿ› ๏ธ ์ˆ˜์ •ํ•œ ์ฝ”๋“œ ์ฝ”๋“œ

const [isBookMark, setIsBookMark] = useState(false)
.
.
.
{productItem.slice(0,4).map((el) => {
return (
  <CardItem
    isBookMark={storedData.some(item => item.id === el.id)}
  >
);

some()๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์—˜๋ฆฌ๋จผํŠธ์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜ ๊ฐ’์ด ํ•˜๋‚˜๋ผ๋„ true๊ฐ€ ์žˆ์œผ๋ฉด true๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ฆ‰ storedData์˜ id์™€ item.id๊ฐ€ ๊ฐ™์€์ง€ ๋‹ค๋ฅธ์ง€์— ๋”ฐ๋ผ ๋ถ๋งˆํฌ ๋ฒ„ํŠผ on/off๋ฅผ ๊ตฌ๋ถ„ ์ง€์–ด์ฃผ์—ˆ๋‹ค.

๋ชจ๋‹ฌ์ฐฝ์€์˜ ๋ถ๋งˆํฌ๋Š” ์ด๋ฏธ ๊ตฌํ˜„๋˜์—ˆ๊ธฐ์— props๋ฅผ ๋‚ด๋ ค์ฃผ์–ด ์ž˜ ์ˆ˜์ •ํ•ด ์ฃผ์—ˆ๋‹ค.๐Ÿ˜†

๊ทธ๋ ‡๊ฒŒ ์™„์„ฑ๋œ ๋ฉ”์ธ ํ™”๋ฉด!


โœ๏ธ๋งˆ์น˜๋ฉฐ

์ƒํ’ˆ ์ปจํฌ๋„ŒํŠธ ์˜์—ญ์˜ ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ ํ•˜๋‚˜ ํ•ด๊ฒฐ ํ–ˆ๋‹ค๊ณ 
๋‚˜๋จธ์ง€ ๊ธฐ๋Šฅ์€ ๋„ˆ๋ฌด ์ˆ ์ˆ  ์ž˜ ํ’€๋ ธ๋‹ค.

์ž‘์—…ํ•˜๋ฉด์„œ "์–ด, ์ด๊ฑฐ ๋„ˆ๋ฌด ์ž˜ ํ’€๋ฆฌ๋Š”๋ฐ?" ์ด๋žฌ๋˜๊ฑฐ ๊ฐ™๋‹ค.

๊ทธ ๋งŒํผ ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ์ด ๋‚˜์—๊ฒ ๋‚œ์ด๋„๊ฐ€ ๋†’์•˜๋˜๊ฑฐ ๊ฐ™๋‹ค.

ํ˜ผ์ž ์ž‘์—…ํ–ˆ์œผ๋ฉด ๋” ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜์„๊นŒ ์‹ถ๋‹ค.
์ด๋ฒˆ ํŽ˜์–ด ํ™œ๋™์€ ๋‚˜์—๊ฒŒ ๋œป ๊นŠ์€ ์‹œ๊ฐ„์ด์˜€๋‹ค.

ํŽ˜์–ด๋‹˜๊ป˜ ๊ฐ์‚ฌ์˜ ์ธ์‚ฌ๋ฅผ..๐Ÿ™‡โ€โ™€๏ธ

profile
๐Ÿ’ป ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ชฉํ‘œ๋กœ ์„ฑ์žฅ ์ค‘! (์•Œ์•„๋ดค๋˜ ๋‚ด์šฉ ๋“ฑ์„ ์ •๋ฆฌํ•˜๊ธฐ)

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