๋๋์ด ํ๋ฆฌ์ง ์์๋ 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
์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์์๋ฅผ ๋ฐ๊ฟ ์๊ฐ์ ์ ํ์๊น..?
ํ์ด๋ ๋๋ถ์ ์์ ์๊ฐ ๋จ์ถ์ด ๋ง์ด ๋์๋ค!
๋ถ๋งํฌ ํด๋ฆญ ์ ์ํ์ ์ ๋ค์ด์ค๋๋ฐ ๋ฒํผ ์คํ์ผ์ด ์๊พธ ์ด์ํ๊ฒ ๋ณ๊ฒฝ๋๋ ๋ฌธ์ ๊ฐ ์์๋ค..ใ
(๊ฐ๋
์ฑ์ ์ํด ๊ธฐ์กด 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๋ฅผ ๋ด๋ ค์ฃผ์ด ์ ์์ ํด ์ฃผ์๋ค.๐
๊ทธ๋ ๊ฒ ์์ฑ๋ ๋ฉ์ธ ํ๋ฉด!
์ํ ์ปจํฌ๋ํธ ์์ญ์ ๋ถ๋งํฌ ๊ธฐ๋ฅ ํ๋ ํด๊ฒฐ ํ๋ค๊ณ
๋๋จธ์ง ๊ธฐ๋ฅ์ ๋๋ฌด ์ ์ ์ ํ๋ ธ๋ค.
์์ ํ๋ฉด์ "์ด, ์ด๊ฑฐ ๋๋ฌด ์ ํ๋ฆฌ๋๋ฐ?" ์ด๋ฌ๋๊ฑฐ ๊ฐ๋ค.
๊ทธ ๋งํผ ๋ถ๋งํฌ ๊ธฐ๋ฅ์ด ๋์๊ฒ ๋์ด๋๊ฐ ๋์๋๊ฑฐ ๊ฐ๋ค.
ํผ์ ์์
ํ์ผ๋ฉด ๋ ๊ฑธ๋ฆฌ์ง ์์์๊น ์ถ๋ค.
์ด๋ฒ ํ์ด ํ๋์ ๋์๊ฒ ๋ป ๊น์ ์๊ฐ์ด์๋ค.
ํ์ด๋๊ป ๊ฐ์ฌ์ ์ธ์ฌ๋ฅผ..๐โโ๏ธ