๋ง์ง๋ง์ธ ์ํ ๋ฆฌ์คํธ, ๋ถ๋งํฌ ๋ฆฌ์คํธ๋ฅผ ์์
์ ์งํํ๋ค.
์ฌ์ฌ์ฉ์ด ์๋ ์ํ ์ปดํฌ๋ํธ ์์
์ ๋ง๋ฌด๋ฆฌํ๋ ๋๋จธ์ง๋ ๊ทธ๋๋ ๋ง์ ์๊ฐ?์ ๋ค์ด์ง ์์์๋๊ฑฐ ๊ฐ๋ค.
์ํ ๋ฆฌ์คํธ, ๋ถ๋งํฌ ๋ฆฌ์คํธ์ ํ์ด์ง๋ ๊ตฌ์กฐ๊ฐ ๋์ผํ๊ธฐ ๋๋ฌธ์ ํ๋๋ง ๋ง๋ค๋ฉด ๊ฑฐ์ ๋๋ฌ๋ค๊ณ ๋ณผ ์ ์์๋ค.
์๋จ์ ํญ๋ฉ๋ด๊ฐ ์๊ณ ํด๋น ๋ฉ๋ด๋ฅผ ํด๋ฆญ ์ ํํฐ๋ง ๋์ด์ ์๋ ํ๋ฉด์ด ๋์จ๋ค.
๋งจ์ฒ์ ๋ค์๋ ์๊ฐ์ ๋ผ์ฐํฐ๋ฅผ ์ด์ฉํ๋ฉด ๊ธ๋ฐฉํ๊ฒ ๋ค! ์๊ฐํ๋ค.
๊ทผ๋ฐ ์ ๊ฑธ? ์๊ฐ ๋ณด๋ค ๋ด๊ฐ ์ํ๋๋๋ก ๊ตฌํ ๋์ง๋ ์์๊ณ
ํด๋ฆญ ํ์ ๋ ์๋ฌด๋ฐ ํ๋ฉด๋ ๋์ค์ง ์์๋ค.
์ด๋ฌ๋ค ๋ผ์ฐํฐ๋ก ์๊ฐ ๋ญ๋นํ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๊ทธ๋ฌ๋ค ๊ตฌ๊ธ๋ง ํ์ ๋ ๊ฐ์ฒด ํ์์ ๋ง๋ค์ด ์ธ๋ฑ์ค ๊ฐ์ ๋ฐ๋ผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋๊ฒ ๋ด์ฉ์ด ์์๋ค.
"์! ์ด๊ฑฐ๋ค!" ์ถ์๋ค.
const [isTapmenu, setIsTapmenu] = useState(0)
const tabContArr = [
{ name: "์ ์ฒด", type: "all", src: imgAll, content: "1" },
{ name: "์ํ", type: "brand", src: imgBrand, content: "2" },
{ name: "์นดํ
๊ณ ๋ฆฌ", type: "category", src: imgCategory, content: "3" },
{ name: "๊ธฐํ์ ", type: "exhibition", src: imgExhibition, content: "4" },
{ name: "๋ธ๋๋", type: "product", src: imgProduct, content: "5" },
];
const handleFilter = (idx) => {
setIsTapmenu(idx)
}
.
.
.
<TabListCont>
{tabContArr.map((el, idx) => (
<TabList key={idx} id={idx} tabContArr={el} isTapmenu={isTapmenu} handleFilter={handleFilter} />
))}
</TabListCont>
<div>
{tabContArr[isTapmenu].content}
</div>
isTapmenu
๋ ํญ๋ฉ๋ด์ ์ธ๋ฑ์ค ๊ฐ์ ์ ์ฅํ๋ค.
tabContArr
๋ ํญ๋ฉ๋ด์ ์ด๋ฆ, ํ์
, ์ด๋ฏธ์ง ๊ฒฝ๋ก, ์ปจํ
์ธ (ํ
์คํธ์ฉ)์ ์ถ๊ฐํด ์ฃผ์๋ค.
map()๋ฉ์๋๋ฅผ ์ด์ฉํด ํ๋ฉด์ ๋ณด์ด๋๋ก ์์
ํ๋ค.
๋ฒํผ ํด๋ฆญ์ handleFilter
์ ์ธ์์ ์ธ๋ฑ์ค ๊ฐ์ด ์ ๋ฌ๋์ด ํด๋น ์ธ๋ฑ์ค ๊ฐ์ ๋ง์ถฐ ์ปจํ
์ธ ๋ด์ฉ์ด ๋ณ๊ฒฝ ๋๋๋ก ์งํํ๋ค.
์ด๊ฑฐ ํ๋ ์์ฑํ๋๋ฐ ๋๊ฒ ๋ฟ๋ฏํ๋ค ใ ใ
์ํ ๋ฆฌ์คํธ๋ ์ํ์ ํ์
์ ํํฐ๋งํด์ ํ๋ฉด์ ๋
ธ์ถ์ํค๋ฉด ๋๊ฒ ๋ค ์๊ฐํ๋ค.
์กฐ๊ฑด๋ฌธ์ ์ค์ productItem
์์์ type์ค tabContArr
๊ฐ ์์์ type๊ณผ ์ผ์นํ๋ ์ํ์ด ์์ ๊ฒฝ์ฐ filterItem
์ ๋ด๊ณ ์ด๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ฒํ๋ ค๊ณ ํ๋ค.
์ผ๋จ ํด๋ฆญ ์ ์ ๋ณด์์ง๋ง ๋๋ฒ ํด๋ฆญ ํด์ผํ๋ ๋ฌธ์ ์ ์ด ์์๋ค.
์ด ๋ useEffect()๋ฅผ ์ฌ์ฉํด ํด๊ฒฐํ ์ ์์๋ค.
const [isFilterType, setIsFilterItem] = useState('')
const [filterItem, setFilterItem] = useState(productItem)
const [isTapmenu, setIsTapmenu] = useState(0)
const tabContArr = [
{ name: "์ ์ฒด", type: "all", src: imgAll, content: "1" },
{ name: "์ํ", type: "brand", src: imgBrand, content: "2" },
{ name: "์นดํ
๊ณ ๋ฆฌ", type: "category", src: imgCategory, content: "3" },
{ name: "๊ธฐํ์ ", type: "exhibition", src: imgExhibition, content: "4" },
{ name: "๋ธ๋๋", type: "product", src: imgProduct, content: "5" },
];
const handleFilter = (idx, type) => {
setIsTapmenu(idx);
setIsFilterItem(type);
};
useEffect(() => {
if (filterItem.length === 0) {
setFilterItem(productItem)
}
let filteredItem = productItem.filter((el) => tabContArr[isTapmenu].type === el.type);
setFilterItem([...filteredItem]);
}, [isTapmenu]);
๊ฐ๊ฐ์ ํญ๋ฉ๋ด ํด๋ฆญ์handleFilter
ํจ์๊ฐ ์งํ๋๋ค.
useEffect์์ isTapmenu
์ ์ํ๊ฐ ๋ณ๊ฒฝ ๋ ๋ ์คํดํ๋๋ก ์งํํ๋ค.
๊ทธ๋ฌ๋๋ ๋๋ฒ ํด๋ฆญํด์ผํ๋ ์ ์ฉ๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์์๋ค.
useEffect์ ์ฌ์ฉํ์ง ์์์ ํ๋ฆ ํ์
์ด ์ด๋ ค์ ๋๋ฐ
์ด๋ฒ ๊ธฐํ๋ฅผ ํตํด ์ด๋ ์ ๋ ์ดํด ํ ์ ์๊ฒ ๋ ๊ฑฐ ๊ฐ๋ค.
์์ฑ๋๋ ํ๋ฉด์ ๋ณด๋ ๋ฟ๋ฏํ๋ค ใ
ใ
ใ
์ํ ๋ฒํผ ํด๋ฆญ ์ ํ๋ฉด์ด ๊น๋ฐ์ด๋ ์ด์๊ฐ ์๋ค.
์ด๊ฑด ๋์ค์ ๋ก๋ฉํ๋ฉด์ ์ถ๊ฐํด ์ฃผ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. (์ด๊ฑด ์๊ตฌ์ฌํญ์ ์๋ ๋ด์ฉ์ผ๋ก ์ถํ ์ ๋ฐ์ดํธํด๋ณด๋ฉด ์ข์ ๋ฏ ์ถ๋ค.)
๋ถ๋งํฌ ๋ฆฌ์คํธ๋ ์ํ ๋ฆฌ์คํธ์ ์คํ์ผ์ด๋ ๊ตฌ์กฐ๊ฐ ๋์ผํด
์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์์๋ค.
์ํ ๋ฆฌ์คํธ ์์ญ์ localStorage์ ์ ์ฅ๋ ์ํ์ ๊ตฌ๋ถ ์ง๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด ์ฃผ์๋ค.
useEffect(() => {
if (filterItem.length === 0) {
setFilterItem(productItem)
} else if (storedData.length === 0) {
setFilterStoredItem(storedData)
}
let filteredItem = productItem.filter((el) => tabContArr[isTapmenu].type === el.type);
let filterStoredItem = storedData.filter((el) => tabContArr[isTapmenu].type === el.type);
setFilterItem([...filteredItem]);
setFilterStoredItem([...filterStoredItem]);
}, [isTapmenu]);
filteredItem
๋ ์ํ ๋ฆฌ์คํธ
filterStoredItem
๋ localStorage์ ์ ์ฅ๋ ์ํ ๋ฆฌ์คํธ์ด๋ค.
์ด๋ ๊ฒ ์์
ํด ์ฃผ๊ณ
filterStoredItem๋ฅผ map()์ ์ด์ฉํด ํ๋ฉด์ ๋ฃ์ด์ฃผ์๋ค.
์์ ์ฉ๋ ๋ง๋ค gif ์ฌ์ด์ฆ๊ฐ ์์์ง ๋ชจ๋ฅด๊ฒ ๋ค...
๊ทธ๋ ๊ฒ ๋ถ๋งํฌ ๋ฆฌ์คํธ ํ์ด์ง๋ ๊ตฌํ ์๋ฃ!
[์๊ตฌ์ฌํญ]
- ๋ถ๋งํฌ ๋ฒํผ ํด๋ฆญ ์ ํ ์คํธ ์๋ ์ฐฝ ๋์ค๊ธฐ
- ๋ฌดํ ์คํฌ๋กค ๊ตฌํ
์ด ๋ ๊ฐ์ง๋ ์ฃผ์ด์ง ๊ธฐ๊ฐ ์์ ๊ตฌํํ์ง ๋ชปํ๋ค.
ํ์ฌ ๋ด๊ฐ ํ ์ ์๋ ๋ฒ์๊น์ง ๊ตฌํํ๋ ๊ฒ๊ณผ ๊นํ์ ๋ํด ๋ฐฐ์ด ๊ฒ์ ์๋ฏธ๋ฅผ ๋์๋ค.
๊ทธ๋์ ์ด ํ๋ก์ ํธ๋ ๋ฆฌ๋์ค๊ฐ ์๋ useState๋ก ๊ด๋ฆฌ๋์ด props๋ก ๋์ง ๋์ง ๋ถ์ด ์๋ค.
๋ฆฌ๋์ค์ ์ข ๋ ์ต์ํด์ง ๋ค์ ๋ฆฌํฉํ ๋งํด๋ ๊ด์ฐฎ๊ฒ ๋ค ์๊ฐํ๋ค.
๊ทธ ๋ ํ ์คํธ ์๋์ฐฝ๊ณผ ๋ฌดํ ์คํฌ๋กค๋ ๊ฐ์ด ๊ตฌํํ๋ฉด ์ข๊ฒ ๋ค ์๊ฐํ๋ค.
.
.
.
gif ํ๋ฉด ๋๋ฌด ์๊ธด ํ๋ฐ...
๋ถ๋งํฌ ์ํ์ด ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ๋น์ด์์ด์
๋ถ๋งํฌ ์ํ์ด ์์ ๊ฒฝ์ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
์ด๋ฒ ์๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ํผ์ ํ๋ค ๋ณด๋ ๋ฌธ์ ๊ฐ ๋ฅ์ณค์ ๋
์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ๋๊ฑฐ ๊ฐ๋ค.
์ค๊ฐ ์ค๊ฐ ํ์ด ํ๋์์ ํ์ด๋ ๋์์ ๋ฐ์ ์ ์๋ค๋ ์ ์ด ์ข์๋ค.
๋ํ ์ฃผ์ด์ง ์กฐ๊ฑด์ ์ ๋ถ ๊ตฌํํ์ง ๋ชปํ๋ค. ์๊ฐ์ด ๋ถ์กฑํ๊ธฐ๋ ํ๊ณ ์์ง ๋ด ์ค๋ ฅ์ ๋์ด๋๊ฐ ๋์ง ์์๊น ์ถ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฆฌ๋์ค๋ก ๊ด๋ฆฌํ๋๊ฒ ์๋ useState๋ฅผ ์ด์ฉํด ์งํํ๊ฑฐ๋ผ props๊ฐ ๋์ง ๋์ง ๋ถ์ด ์์ด ์ง์ ๋ถํ๊ธฐ๋ ํ๋ค.
๋์ค์ ์๊ฐ์ ๋ค์ฌ ๋ฆฌํฉํ ๋งํ ์์ ์ด๋ค.
๊ทธ ๋ ๋ฒ๊ทธ๋ ๊ตฌํํ์ง ๋ชปํ๋ ์ ๋ฑ์ ๊ฐ์ด ์งํํด ๋ณด๋ฉด ์ข๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
4์ผ ๋์ ์งง์ง๋ง ํ๋ก์ ํธ๋ฅผ ๊ฐ์ ์ฒดํํ ๊ฒ ๊ฐ๊ณ ๊นํ branch ๋ฑ์ ๋ํด ์ข ๋ ์ ์ ์์๋ ์๊ฐ์ด์๋ค.
๋จ์ ๊ธฐ๊ฐ๋ ํ๋ด๋ณด์...