๐พ๋ค์ด๊ฐ๋ฉฐ
์ด์ ์ ์ด ์ฝ๋๋ฅผ ๋์๋ณด๋ฉด์ ๋ฆฌํฉํ ๋ง์ ํด๋ณด์๋๋ฐ, ์ ๋ง ๊ณผ๊ฑฐ์ ์ ์๊ฒ ์ํ๊น์ด ์์ ์ด ๊ฐ๋๋ค.
๋ฆฌํฉํ ๋งํ๋ฉด์ ์ด๋ค ํ๋์ผ๋ก ์ด๋ป๊ฒ ๋ณํํ๋์ง ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ฝ๋์ ์ ๋ฌธ์ ๋ค์ ๋งํฌ์ ์ฌ๋ ค๋์์ต๋๋ค: https://gist.github.com/Sleepingoff/8c9494d244374292446f3f1784169c12
โจ๋ณธ๊ฒฉ์ ์ผ๋ก
โ ์ด๋ค ์ผ์ ํ๊ณ ์์๊น?
๋จผ์ ํด๋น ์ปดํฌ๋ํธ์์ ์ด๋ค ๊ธฐ๋ฅ๋ค์ด ์๋์ง ์์๋ณด์์ต๋๋ค.
user๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ฐ์ ์ด๊ธฐํํ๊ณ ํ์ฌ ์๊ฐ์ ๋ง์ถฐ์ day ์ํ๋ฅผ ์ ๋ฐ์ดํธ
- holiday๋ผ๋ ๊ณตํด์ผ ๋ฐ์ดํฐ๋ฅผ ํ ๋๋ก ๊ณตํด์ผ์ด๋ผ๋ฉด ํ ๋ฒ ๋ day ์ํ๋ฅผ ์ฒดํฌํด์ ์ ๋ฐ์ดํธ
์๋ก๊ณ ์นจ, ๋ ์ง๋ณ๊ฒฝ, ์งํ์ฒ ๋ฐฉํฅ ๋ณ๊ฒฝ์ ๋ฐ๋ผ์ ๊ฐ ์ด๊ธฐํ
- rowInfo: ์งํ์ฒ ์ ๋ณด
- count: ์์ฒญ ํ์
์งํ์ฒ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
1๋ฒ์ ๊ฒฝ์ฐ ์ ๋ง ์ปดํฌ๋ํธ์ ์๊ด์ด ์๋ ๊ณ์ฐ ๋ก์ง์ด์์ต๋๋ค.
2๋ฒ์ ๊ฒฝ์ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ฌ๋ฌ ์ํ๋ก ์ ์ธํ ๋ณ์๋ค์ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
3๋ฒ์ ๊ฒฝ์ฐ ํด๋น ์ปดํฌ๋ํธ๋ ํ์ด์ง๋ก ์ฐ์ด๊ธฐ ๋๋ฌธ์ api ํธ์ถ์ ํ๋ ์ฑ
์์ด ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๊ทธ๋์ ์ผ๋จ 3๋ฒ์ ์ ์ธํ๊ณ 1๋ฒ๊ณผ 2๋ฒ์ ์ง์ค์ ์ผ๋ก ๊ฐ์ ํ๋ ค๊ณ ํฉ๋๋ค.
โ ๋ณ์๋ช ? ์ ์ธ? ๋ณ๊ฒฝํ๊ธฐ
๊ธฐ์กด์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ๊ฐ์ฅ ์ฌ๊ฐํ๋ ๊ฒ์ด ๋ณ์๋ช ์ ๋๋ค. ๋ฌด์จ ๋ป์ธ์ง ํ์ฐธ์ ๊ณจ๋ํ ์๊ฐํด์ผ ๊ฒจ์ฐ ๊ธฐ์ต๋๋ ์ด๋ฆ๋ค ๋ฟ์ด์์ต๋๋ค. ์ฌ์ง์ด ์ด๋ฅผ useState๋ก ํ๋ํ๋ ์ ์ธํ ๊ฑธ ๋ณด๋ ์ฐธ..ใ ใ
๊ธฐ์กด ์ฝ๋
//rowInfo: [] @description ์๋ง ๋ฐ์ดํฐ ๊ฐ์ ธ์ฌ ๋ ํค๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ ๋ณ์๋ช
. ์งํ์ฒ ์ญ์ ๋ณด๊ฐ ๋ด๊ฒจ์ ธ ์๋ค.
const [rowInfo, setRowInfo] = useState([]);
//reqCount: numer @description ์์ฒญํ์. ์ ์ง์ง ๊ธฐ์ต ์๋..
const [reqCount, setReqCount] = useState(0);
//count: number @description reqCount๊ฐ ๋ฒ์๋ผ๋ฉด count๋ reqCount ๋ฒ์ ๋ด์์ ๋์๊ฐ๋ ์ซ์ ์ ์ด๋ด์์ด์ง?
const [count, setCount] = useState(0);
//day: string @description ํ์ฌ ์์ผ์ ๋ํด์ ํ์ผ, ํ ์์ผ, ๊ณตํด์ผ์ธ์ง ์ซ์๋ก ๋ํ๋ด์ ๊ตฌ๋ถ
const [day, setDay] = useState(`1`);
//refresh: boolean @description ์๋ก๊ณ ์นจ์ฉ ๋ฒํผ์ ์ํ ๊ฐ. ์๋ก๊ณ ์นจ: ๋จ์ ์งํ์ฒ ์๊ฐ๋๋ฌธ์ ํ์
const [refresh, setRefresh] = useState(false);
//direct: string @description day์ ๋น์ท. ์ํ, ํํ, ์ํ ๋ฑ์ ์ซ์๋ก ๋ํ๋ด์ ๊ตฌ๋ถ
const [direct, setDirect] = useState('1');
//showTime: boolean @description ๊ธํ์ ์ด๋ฒคํธ๋ก ์ฒ๋ฆฌํ๊ณ ์๋๋ฐ, ์ค์ง์ ์ผ๋ก ์ด๋ค ์ญํ ์ ํ๋์ง ๊ธฐ์ต ์๋..
const [showTime, setShowTime] = useState(false);
์ฃผ์์ผ๋ก ๊ฐ state์ ์ด๋ค ์ ๋ณด๊ฐ ๋ด๊ธฐ๋์ง ์ ์ด๋ณด์๋๋ฐ, ๊ตณ์ด ์ํ๋ก ์ ์ธํ์ง ์์๋ ์ธ ์ ์๋ ๋ณ์๋ค๋ ์์ฌ ์์๊ณ , ์ ๋ง ๋ง๋ค๋ค๊ฐ ๋ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์์๋ ์ ์ธํ ์ํ๋ค๋ ์์์ต๋๋ค. ๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ์ข ๋ณ๊ฒฝํ์ต๋๋ค.
๋ฆฌํฉํ ๋ง ์ดํ
const [count, setCount] = useState(0);
const [refresh, setRefresh] = useState(false);
const [timeTableInfo, setTimeTableInfo] = useState([]);
//์๋ฌ์ผ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด state ์ถ๊ฐ
const [isError, setIsError] = useState(false);
const ONCE_REQ_LIST_COUNT = 5;
const START_INDEX = ONCE_REQ_LIST_COUNT*count;
const currentDay = getUserSettingDay();
const currentDirect = getUserDirect();
//button UI๋ฅผ ์ํด ์ถ๊ฐ. ํ์ฌ ์ ํํ ๋ฒํผ์ variant ๊ฐ์ ๋ค๋ฅด๊ฒ ์ฃผ๊ธฐ ์ํจ.
const isCurrentDay = (number) => currentDay === number + '';
const isCurrentDirect = (number) => currentDirect === number + '';
const makeClickedButton = (boolean) => boolean ? 'primary' : 'basic'
const subTimeParams = {
startIndex: START_INDEX,
endIndex: START_INDEX + ONCE_REQ_LIST_COUNT-1,
stationCD: getUserStationCD(),
day: currentDay ,
direct: currentDirect
}
- ์ธ๋ถ ํจ์๋ก ๋ณ๊ฒฝ: ๊ธฐ์กด์ state๋ก ์ ์ธํ ์น๊ตฌ๋ค์ ๋ฐ๋ก ํ์ด์ง์์ ๊ณ์ฐ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ถ๋ถ์ ์ธ๋ถ ํจ์๋ก ์ ์ธ
- ๋ฐ๋ก ๊ฐ์ฒด๋ก ๋ณ์๋ฅผ ์ ์ธ: state ๊ด๋ฆฌ๊ฐ ๊ตณ์ด ํ์์๊ณ , ๋ ๋๋งํ ๋๋ง๋ค ๊ฐ์ ์๋ก ํ ๋นํด๋ ๋ฌธ์ ๊ฐ ์๋ค.
- ํ๋ฒ์ ๋ถ๋ฌ์ฌ ๋ฆฌ์คํธ ๊ฐ์๋ ๊ณ ์ ๋ ๊ฐ์ด๋ ์์ํํ๋ก ์ ์ธ
โ ๊ณ์ฐ ๋ก์ง ์ธ๋ถ ํจ์๋ก ์ ์ธ
user์ ํ์ฌ ์๊ฐ์ ์์๋ด๊ณ , ํด๋น ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์งํ์ฒ ์๊ฐํ๋ฅผ ํ์ผ, ๊ณตํด์ผ, ํ ์์ผ ๋ฑ์ ๊ธฐ์ค์ผ๋ก ๋ณด์ฌ์ค์ผ ํฉ๋๋ค.
๊ธฐ์กด ์ฝ๋
useEffect(()=>{
setRowInfo([]);
setCount(0);
},[id])
//TODO: ์ฌ์ฉ์ ์์น, ์๊ฐ์ ๋ง๊ฒ ์๊ฐํ ์กฐํํ๊ธฐ
useEffect(()=>{
const userDate = new Date();
const today = userDate.getDay();// 0: ์ผ์์ผ ~ 6: ํ ์์ผ
const date = userDate.getDate();
const month = userDate.getMonth() + 1;
const year = userDate.getFullYear();
switch(today){
case 6:
setDay('2');
break;
case 0:
setDay('3');
break;
default:
setDay('1');
break;
}
if(holiday.holiday.includes(`${year}-${month}-${date}`)){
setDay(3);
}
setDirect('1');
}, [refresh])
๊ธฐ์กด์ ์๋ ๊ณ์ฐ ๋ก์ง๋ค ์ ๋๋ค. ์ด๊ธฐํ ์ ์คํํ๋๋ก ์ค์ ํ์ต๋๋ค.
ํ์์๋ useEffect๋ฅผ ์ฌ์ฉ: ์ด๊ธฐํ๋ , ๋ค๋ฅธ ๋ฒํผ์ ํด๋ฆญํด์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ๊ณ์ฐ ๋ก์ง์ ์คํ๋ผ์ผ ํฉ๋๋ค. ์๋ง ์ฌ๊ธฐ์์ ์ข ์ค๋ฅ๊ฐ ๋์ง ์์๋ ์ถ์์ต๋๋ค.
์ฌ๋ฌ ๋ถ๊ธฐ ์ฒ๋ฆฌ: swtich๋ ๊ทธ๋ ๊ณ , if๋ฌธ๋ ๊ทธ๋ ๊ณ ๊ฐ๋ ์ฑ์ด ์ข์ง ์์ต๋๋ค. ์ฌ์ง์ด day ๊ฐ๋ง ๋ฐ๋๋ ์ค ์์๋๋ ๋ฌ๊ธ์์ด ๋ง์ง๋ง ์ค์ setDirect๋ก direct ๊ฐ๋ ๋ณ๊ฒฝํ๊ณ ์์ต๋๋ค.
๋ฆฌํฉํ ๋ง ์ดํ
const initUserDay = () => {
let INIT_USER_DAY = getUserToday();
searchParams.set('day', INIT_USER_DAY)
}
//์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด๋ถ์์ setUserDay ์ฌ์ฉ
const setUserDay = (string) => {
searchParams.set('day', string)
}
const getUserSettingDay = () => {
return searchParams.get('day')
}
const getUserToday = () => {
const userDate = new Date();
const today = userDate.getDay();// 0: ์ผ์์ผ ~ 6: ํ ์์ผ
const date = userDate.getDate();
const month = userDate.getMonth() + 1;
const year = userDate.getFullYear();
const isHoliday = holiday.holiday.includes(`${year}-${month}-${date}`);
if( isHoliday || today === 0) return `3`
else if(today === 6) return `2`
else return `1`
}
๋ณ๋๋ก ํ ์ผ๋ก ๋ง๋ค์ด์ ๋ฃ์์ต๋๋ค. useSearchParams ํ ์ ์ฌ์ฉํ๊ธฐ๋ ํ์ต๋๋ค.
- ์ ์ญ ์ํ์ธ url ์ฟผ๋ฆฌ ์คํธ๋ง ์ฌ์ฉ: ํ๋ ํ๋ state๋ก ํ๋ ๊ฒ๋ณด๋จ ์ ์ญ ์ํ์์ ๊บผ๋ด์ค๋ ๊ฒ์ผ๋ก ๋์ฒดํ์ต๋๋ค.
- init, set, get ๋ฑ์ผ๋ก ์ญํ ๋ถ๋ฆฌ: ์ด๊ธฐ๊ฐ์ getUserToday๋ฅผ ์ฌ์ฉํ ๊ฒ์ด์ง๋ง, ๊ทธ ๋ค์๋ถํฐ๋ ์ฌ์ฉ์๊ฐ ์ ํํ ๊ฐ์ผ๋ก ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฒ์ ๊ฐ์ ์ด๊ธฐํํ ๋ ์ฌ์ฉํ ํ์ฌ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐํ๋ ๋ก์ง, ์๋ก์ด ๊ฐ์ผ๋ก ์ค์ ํ๋ ๋ก์ง, ํด๋น ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ก์ง์ผ๋ก ๋ถ๋ฆฌํ์ต๋๋ค.
โ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ ๋ฆฌ
๊ธฐ์กด ์ฝ๋
const handleClickRefresh = () => { setRefresh(!refresh);}
const handleClickDay = (event) => {setDay(event.target.id);}
const handleClickDirect = (event) =>{setDirect(event.target.id || "1");}
์ต๊ทผ์ ์ด๋ฒคํธ ํจ์๋ฅผ returnํ๋ฉด ์ฌ์ฉ์ด ํธํ ๊ฑธ ์์์ต๋๋ค. ๊ทธ๋์ ํด๋น ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ณ๊ฒฝํ์ต๋๋ค.
๋ฆฌํฉํ ๋ง ์ดํ
const handleClickRefresh = (refresh) => () => { setRefresh(refresh) }
const handleClickDay = (id) => (event) => { setUserDay(id) }
const handleClickDirect = (id) => (event) =>{ setUserDirect(id) }
const handleClickMore = () => {setCount( prev => prev + 1 )}
- () => (event) => {} ํํ๋ก ๋ณ๊ฒฝ
- setState: ๊ธฐ์กด state๋ก ์ ์ธํ ๋ณ์๋ค์ ๋ณ๊ฒฝ์ผ๋ก ํด๋น ๋ถ๋ถ๋ ๊ต์ฒด
- clickMore: count๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ํ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ ์ธ
โ return ๋ถ๋ถ ์ ๋ฆฌ
์์ ๋ฆฌํฉํ ๋ง ๊ณผ์ ์ ๊ฑฐ์น๋ฉด์ return ๋ถ๋ถ์๋ ๋ง์ ๋ณํ๊ฐ ์์์ต๋๋ค.
๊ธฐ์กด ์ฝ๋
return(
<PageTemplate>
<StyledLinkBtn onClick={handleClickStation}>{state}</StyledLinkBtn>
<ButtonWrap>
<DayButton onClick={handleClickDay}>
<DefaultBtn variant={day === "1" ? "primary" :"basic"} id='1'>ํ์ผ</DefaultBtn>
<DefaultBtn variant={day === "2" ? "primary" :"basic"} id='2'>ํ ์์ผ</DefaultBtn>
<DefaultBtn variant={day === "3" ? "primary" :"basic"} id='3'>๊ณตํด์ผ</DefaultBtn>
</DayButton>
<DirectButton onClick={handleClickDirect}>
<DefaultBtn variant={"secondary"} onClick={handleClickRefresh}>์ด๊ธฐํ</DefaultBtn>
<DefaultBtn variant={direct === "1" ? "primary" :"basic"} id='1'>์ํ</DefaultBtn>
<DefaultBtn variant={direct === '2' ? "primary" :"basic"} id='2'>ํํ</DefaultBtn>
<DefaultBtn variant={"basic"} onClick={()=>setShowTime(!showTime)}>๊ธํ</DefaultBtn>
</DirectButton>
</ButtonWrap>
<ul>
{rowInfo.map((info, index)=>{
return (
<StyledList key={index}>
<Time>{info[0]}</Time>
<Station>{info[2]} โก๏ธ {info[3]}</Station>
<StyledTag aria-label="์งํ์ฒ ๋ฒํธ">{info[1]}</StyledTag>
</StyledList>
)
})}
</ul>
</PageTemplate>
)
๋ฆฌํฉํ ๋ง ์ดํ
return(
<PageTemplate>
<StyledLinkBtn onClick={handleClickStation}>{state}</StyledLinkBtn>
<ButtonWrap>
<DefaultBtn variant={"secondary"} onClick={handleClickRefresh(!refresh)}>์ด๊ธฐํ</DefaultBtn>
<DayButton>
['ํ์ผ', 'ํ ์์ผ', '๊ณตํด์ผ'].map((day, index) => (
<DefaultBtn key={index} variant={makeClickedButton(isCurrentDay(index+1))} onClick={handleClickDay(`${index+1}`)}>{day}</DefaultBtn>
))
</DayButton>
<DirectButton>
['์ํ', 'ํํ'].map((direct, index) => (
<DefaultBtn key={index} variant={makeClickedButton(isCurrentDirect(index+1))} onClick={handleClickDirect(`${index+1}`)}>{direct}</DefaultBtn>
))
</DirectButton>
</ButtonWrap>
{isError ?
<ErrorComp/>
: <ul>
{timeTableInfo.map((info)=>(
<StyledList key={info.id}>
<Time>{info.ARRIVETIME}</Time>
<Station>{info.SUBWAYSNAME} โก๏ธ {info.SUBWAYENAME}</Station>
<StyledTag aria-label="์งํ์ฒ ๋ฒํธ">{info.TRAIN_NO}</StyledTag>
</StyledList>
))}
</ul>
}
<DefaultBtn variant={"secondary"} onClick={handleClikMore}>๋ ๋ถ๋ฌ์ค๊ธฐ</DefaultBtn>
</PageTemplate>
)
- button๋ค ์ ๋ฆฌ: ๊ธฐ์กด์๋ ์ข ๋ ์ ๋ณด๋ฅผ ์ ๋ณด์ด๊ธฐ ์ํด์ ํ์ด์ ์ผ๋ค๋ฉด, ์ด๋ฒ์๋ ์ข ๋ฌถ์ด์ ์ค๋ณต๋ ์ฝ๋๋ฅผ ์ค์ฌ๋ณด์์ต๋๋ค. ์ด๋ถ๋ถ์ ๋ํด์ ์ ๋ต์ด ์์ต๋๋ค. ์กฐ๋ง๊ฐ DayButton๊ณผ DirectButton ์ปดํฌ๋ํธ๋ ์ถ์ํํด์ ์ค์ด๋ค ๊ฒ ๊ฐ์ต๋๋ค.
- timeTableInfo: ๊ธฐ์กด์ ๋ฐฐ์ด ๋ด ๋ฐฐ์ด๋ก ์ ๋ณด๋ฅผ ๋ฃ์ด์ ํน์ ์ธ๋ฑ์ค๋ก ๋ถ์ด์๋ค๋ฉด, ๊ฐ์ฒด๋ก ๋ฃ์ด์ ์ด๋ค ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์ค๋์ง ์ข ๋ ๋ช ํํ๊ฒ ํ์ํ์ต๋๋ค.
โ๏ธ๊ฒฐ๋ก
๋ถ์ ํจ๊ณผ๋ฅผ ๋ฐ์ํ๋ ์ก์ ๊ณผ ์์ ๊ณ์ฐ ์์ฃผ๋ก ํ์ฌ ๋ถ์ ํจ๊ณผ๊ฐ ์๋ ๊ณ์ฐ์ด๋ผ๋ ์ญํ ๋ก ๋ถ๋ฆฌ๋ฅผ ํ๋ฉด์ ๊ฐ์ ํ ์ ์์์ต๋๋ค. ๋ฌผ๋ก ๋ ์์ ๋ด์ผ ํฉ๋๋ค. ํ ๋ฒ์ ๋ถ๋ฌ์ค๋ useSubTime ์ค์์๋ day๋ง ๋ ๋ฐ๋ก ๋ถ๋ฆฌํด์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๊ทธ๋ ์ง๋ง, ์์ง ๋ ๋ณต์กํ ์ฝ๋๋ฅผ ๋ณธ ์ ์ ์์ง๋ง, ๊ธฐ์ค์ด ์ ํด์ง๊ณ ๋ฆฌํฉํ ๋ง์ ํ๋ ๋๋ฌด ์ฌ๋ฐ๋ค์... ๊ณผ๊ฑฐ์ ๋์ผ ๋ฑ ๊ธฐ๋ค๋ ค!!
'Create' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๋ ๊ทธ๋๋ ํ๊ธด ํ์์ด...? (1) | 2024.05.30 |
---|---|
[React] ์ ๋ฐ์ํ ํ ์คํธ๋ฐ์ค๋ ์คํ์ผ๋ก ๋ง๋๋๊ฐ? (0) | 2024.05.11 |
[React] ์ปดํฌ๋ํธ๋ ํ ๋ฒ์ ํ๋์ ์ฑ ์๋ง ์ง๋ค. (0) | 2024.05.05 |
[package] ๋ ๋ญ ์๊ณ ์์๊น? (0) | 2024.04.28 |
[front] ํ๋ก์ ํธ ์ด๊ธฐ ์ธํ : linter, formatter (1) | 2024.04.19 |