Intro
์๋ ํ์ธ์. ์ด๋ฒ ์๊ฐ์๋ ๋ฆฌ์กํธ์์ ๋ก๋ฉ๋ฐ ํ์ ๋ฐ ๋ก๋ฉ ์๋๋ฅผ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
How to solve the problem
๋ค์์ List ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. handleFilterClickํจ์๋ฅผ ํด๋ฆญ ํ ๋๋ง๋ค ํํฐ๊ธฐ๋ฅ์ด ์๋๋๋ ๋ก์ง์ ๋๋ค. ํํฐ๋ฅผ ๋๋ฅผ ๋๋ง๋ค ํํฐ๊ฐ ๋๋ฏํ ๋์์ ํํํ๊ธฐ ์ํด ๋ก๋ฉ๋ฐ๋ฅผ ์ถ๊ฐ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
const List: NextPage<Props> = () => {
const {dataList, setDataList} = useLoginStore();
const [totalCtn, setTotalCtn] = useState<number>();
const [filterStatus, setFilterStatus] = useState("ALL");
const handleFilterClick = (status: string) => {
setFilterStatus(status);
};
const isFiltered = () => {
// some conditional
};
return (
<div>
<div onClick={() => handleFilterClick("ALL")}>{data && totalCtn}</div>
<div onClick={() => handleFilterClick("TOP")}>{data.top}</div>
<div onClick={() => handleFilterClick("SKIRT")}>{data.skirt}</div>
{dataList?.map((item, index: number) => {
if (isFiltered()) {
return (
<div>
<button type="button">
<strong>{item.name}</strong>
</button>
</div>
);
}
})}
</div>
);
};
export default List;
๋ก๋ฉ๋ฐ ์ถ๊ฐํ๊ธฐ
์ฐ์ ๋ก๋ฉ๋ฐ ํ์๋ฅผ ์ํด ์ํ๊ฐ์ ์๋์ ๊ฐ์ด ์ ์ํด์ค๋๋ค.
const [isLoading, setIsLoading] = useState(false);
์ด๋ฏธ ์กด์ฌํ๋ ๋ฐ์ดํฐ ๋ฆฌ์คํธ๋ฅผ ๋ฟ๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ ์์๊ฐ์ ํํฐ๊ฐ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ก๋ฉ๋ฐ ํ์๋ฅผ ์ํด์๋ ํํฐ ํดํ๋ ์๊ฐ ์๊ฐ์ ์ ๊น์ด๋๋ง ์ง์ฐ์์ผ์ผ ํ์ต๋๋ค. ๋ฐ๋ผ์ ์ ๋ ์๋์ ๊ฐ์ด setTimeout()์ ํ์ฉํด์ ์งง์ ํ ์ ์ถ๊ฐํด ์คฌ์ต๋๋ค.
์ฆ handleFilterClick ํจ์๊ฐ ํด๋ฆญ๋๋ ์๊ฐ isLoading ๊ฐ์ true๋ก ๋ง๋ค๊ณ , ์๊ฐํ ์ ๋ ํ์ isLoading๊ฐ์ false๋ก ๋ง๋ค์๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
const handleFilterClick = (status: string) => {
setIsLoading(true);
setTimeout(() => {
setIsLoading(false);
setFilterStatus(status);
}, 100);
};
๋ ๋๋ง๋ ์ปดํฌ๋ํธ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํด์คฌ์ต๋๋ค. isLoading๊ฐ์ด true์ผ ๋ Loding ์ปดํฌ๋ํธ๋ฅผ ํ์ํด์คฌ์ต๋๋ค.
<div>
<div onClick={() => handleFilterClick("ALL")}>{data && totalCtn}</div>
<div onClick={() => handleFilterClick("TOP")}>{data.top}</div>
<div onClick={() => handleFilterClick("SKIRT")}>{data.skirt}</div>
{isLoading ? (
<Loding />
) : (
<>
{dataList?.map((item, index: number) => {
if (data && isFiltered()) {
return (
<div>
<button type="button">
<strong>{item.name}</strong>
</button>
</div>
);
}
})}
</>
)}
</div>