2022.05.14 velog์ ์์ฑํ๋ ๊ธ์ ๋๋ค
๋ฌ๋ ์ดํ์ธ ๋งํผ ์ ๋ณด๊ฐ ์ค์๊ฐ์ผ๋ก ๋ฐ๋์ด์ผ ํ๋ค. ์ค์๊ฐ์ด๋ผ๊ธฐ ๋ณด๋ค๋ ์ด ๋จ์๋ก ๋ฐ๋์ด์ผ ํ๋ค๋ ๋ง์ด ๋ ์ ํฉํ๊ธด ํ๊ฒ ๋ค. ์๋ฌดํผ ๋ํ์ ์ธ ์ค์๊ฐ ์ ๋ณด๋ '์ฌ์ฉ์๊ฐ ๋ฌ๋ฆฐ ์๊ฐ'์ด๋ค. ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐํด์ฃผ์ด์ผ ํ๋ ๊ฐ๋ค์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์(ex ํ์ด์ค, ์นผ๋ก๋ฆฌ) ์ด ๊ฐ์ ์ ๊ด๋ฆฌํด์ค์ผ ํ๋ค ๐ ...
๊ตฌํ ๋ชฉํ โฐ
์๋ ์ด๋ฏธ์ง์ ํ์ด๋จธ๋ฅผ ๊ตฌํํ๊ณ ์ ํ๋ค.
- 1์ด์ฉ ์ฆ๊ฐํด์ผ ํ๊ณ , ๋ฐ๋ ๊ฐ์ด ํ๋ฉด์๋ ๋ฐ๋ก ๋ฐ์๋์ด์ผ ํ๋ค.
- ์ฌ์ฉ์๊ฐ ์ผ์์ ์ง ๋ฒํผ์ ๋๋ฅด๋ฉด ์๊ฐ ์ฆ๊ฐ๋ ๋ฉ์ถฐ์ผ ํ๋ค.
- ๋ฌ๋์ ์ฌ๊ฐํ๋ฉด ์ผ์์ ์ง ๋ฒํผ ๋๋ฅด๊ธฐ ์ ์๊ฐ์์ ๋ค์ 1์ด์ฉ ์ฆ๊ฐํด์ผ ํ๋ค.
๊ธฐ๋ณธ ํ์ด๋จธ ๊ตฌํ
useInterval์ด๋ผ๋ custom Hook์ ์ฌ์ฉํ๋ค.
๋ฆฌ์กํธ์ ๊ธฐ๋ณธ Hook์ธ setInterval์ ํ์ฉํด ํ์ด๋จธ๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ, ํ์ด๋จธ์ ์๊ฐ ํ๋ฆ๊ณผ ์ค์ ์๊ฐ ํ๋ฆ ์ฌ์ด์ ๊ดด๋ฆฌ๊ฐ ์๊ธธ ์ ์๋ค๊ณ ํ๋ค. ์ด๋ฅผ ๋ณด์ํด ๋ง๋ ๊ฒ useInterval์ธ ๊ฒ ๊ฐ๋ค.
setInterval์ ๊ธฐ๋ณธ ๋์์ ์ค์ ํ ์๊ฐ๋ง๋ค ํ ๋ฒ์ฉ ์ฝ๋ฐฑํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ useInterval์ ์ฌ์ฉํด 1000ms๋ง๋ค ์๊ฐ์ ์ฆ๊ฐ์ํค๋ ํจ์๋ฅผ ํธ์ถํ๋ค.
์์ธํ ์ค๋ช ์ ์๊ธฐ Making setInterval Declarative with React Hooks
๋ moment.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ duration object๋ฅผ ์ฌ์ฉํ๋ค. moment.js๋ ์ด ํ์ ํ๋ฉด์ ์ฒ์์ผ๋ก ์๊ฒ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฐ๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ ์ง์ ์๊ฐ์ ๋ค๋ฃฐ ๋ ๋ง์ด ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ํ๋ค. ํฌ๋งคํ
์ด๋ผ๋์ง, ๋จ์๊ฐ ๋ณํ ๋ฑ์ ์์
์ ์์ฝ๊ฒ ํ ์ ์๋๋ก ๋์์ค๋ค. duration์ ๋ง๊ทธ๋๋ก a length of time์ ๋ปํ๋ ๊ฐ์ฒด์ด๋ค. ์ฝ์์ duration ๊ฐ์ฒด๋ฅผ ์ฐ์ด๋ณด๋ฉด PT1S
PT2M30S
์ด๋ฐ ์์ผ๋ก ์๊ฒผ์์ ํ์ธํ ์ ์๋ค.
const [time, setTime] = useState(moment.duration(0,'seconds'));
const tick = () => {
setTime(prevTime => prevTime.clone().add(1, 'seconds'));
};
const timer = useInterval(() => {
tick();
}, 1000);
์๊ฐ์ด 1์ด ์ฆ๊ฐํ ๋๋ง๋ค ํ๋ฉด์ ๋ฐ์๋์ด์ผ ํ๋ฏ๋ก state๋ก ์ ์ํ๋ค.
์ผ์์ ์ง ๋ฒํผ์ ๋๋ฅด๋ฉด ํ์ด๋จธ๋ ์ ์ง
์ด๊ฑธ ๋ค๋ฅด๊ฒ ์ด์ผ๊ธฐํ๋ฉด, ํ๋ฉด์ ํฌ์ปค์ค๊ฐ ์กํ์ ๋์๋ง ํ์ด๋จธ๋ฅผ ๋์์์ผ์ผ ํ๋ค๋ ๋ป์ด๋ค.
ํด๋น ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ์์ ํ๋ฉด์ ๋ ์๋์ง๋ฅผ ์์๋ด์ผ ํ๋ค.
ํ๋ฉด์ ํฌ์ปค์ค๊ฐ ์กํ -> ํ์ด๋จธ ์์/์ฌ๊ฐ
ํ๋ฉด์ ํฌ์ปค์ค ์ฌ๋ผ์ง -> ํ์ด๋จธ ์ค์ง
ํ๋ฉด์ ํฌ์ปค์ค๊ฐ ์กํ๋ ๊ฒ๊ณผ ์ฌ๋ผ์ง๋ ๊ฒ์ ๋ชจ๋ ์บ์นํด์ผ ํ๋ค.
focus
๋ผ๋ state๋ฅผ ๋ฌ์ ํ๋ฉด์ด ํฌ์ปค์ฑ๋๋ฉด ๊ฐ์ true, ํฌ์ปค์ค ์์๋๋ฉด false๋ก ๊ฐ์ ์
๋ฐ์ดํธ ํด์ฃผ๊ณ ์ ํ๋ค.focus
๊ฐ์ด true์ผ ๊ฒฝ์ฐ ํ์ด๋จธ๋ฅผ ์ฆ๊ฐ์ํค๊ณ , false๋ก ๋ฐ๋ ๊ฒฝ์ฐ clearInterval๋ก ํ์ด๋จธ๋ฅผ ์ ๊ฑฐํ๋ค.
const timer = useInterval(() => {
if (focus) {
tick();
}
}, 1000);
if (!focus) {
clearInterval(timer);
}
1ํธ: useEffect
๊ฒฐ๊ณผ: โ
useEffect๋ฅผ ์ด์ฉํ๋ฉด ํ๋ฉด์ด ๋ ๋๋ง๋ ํ ๋ง์ดํธ๋ ๋ ํน์ ์์
์ ์ํํ ์ ์๋ค.
๋ฌธ์ ๋ ๋ฆฌ์กํธ ๋ด๋น๊ฒ์ด์
์ผ๋ก ํ๋ฉด ์ด๋์ ์ปดํฌ๋ํธ์ ๋ง์ดํธ/์ธ๋ง์ดํธ๊ฐ ์ด๋ค์ง์ง ์๋๋ค๋ ์ ์ด์๋ค.
RunningScreen
์ปดํฌ๋ํธ์์ navigation.push๋ฅผ ํตํด PauseScreen
์ปดํฌ๋ํธ๋ก ์ด๋ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด๋ RunningScreen
์ ์ธ๋ง์ดํธ ๋๋ ๊ฒ ์๋๋ผ, ์ฆ ํ๋ฉด์์ ์ฌ๋ผ์ง๋ ๊ฒ ์๋๋ผ ๊ทธ๋๋ก ์๊ณ ๊ทธ ์์ PauseScreen
์ด ์์ด๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ useEffect๋ก๋ ํ๋ฉด์ ํฌ์ปค์ฑ์ ๊ฐ์งํ ์ ์์๋ค.
2ํธ: useFocusEffect
๊ฒฐ๊ณผ: โ
์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ Hook์ด๋ค. ์ฉ๋๋ ์ ํฉํ๋๋ฐ, ํ์ด๋จธ์ ์กด์ฌ๊ฐ ๋ฌธ์ ๊ฐ ๋๋ค.
ํ์ด๋จธ ๋๋ฌธ์ 1์ด ๋ง๋ค RunningScreen
์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋๋ฐ, ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค useFocusEffect์์ ์์ฑํ ํจ์๊ฐ ํธ์ถ๋๋ค. 1์ด๊ฐ ์ฆ๊ฐํ ๋๋ง๋ค useFocusEffect์ ์์ฑํ ์ฝ๋ฐฑํจ์์ ๋ฆฌํดํจ์๊ฐ ์ฐ๋ฌ์ ํธ์ถ๋์ด ํ์ด๋จธ๊ฐ ์ ๋๋ก ๋์ํ์ง ์์๋ค.
(์ง๊ธ ๋ค์ ์๊ฐํด๋ณด๋ ํ์ด๋จธ๋ฅผ ๋ณ๋์ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํด ํด๋น ์ปดํฌ๋ํธ ๋ด์์๋ง ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๊ฒ ํ๊ฑฐ๋, focus
state๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ก์ง์ useCallback์ผ๋ก ์์ฑํด๋ ๋์ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ ์ด ๋ฐฉ๋ฒ์ ์๊ฐ์ง ๋ชปํ๋ค.)
3ํธ: navigation.addListener
๊ฒฐ๊ณผ: โ
navigation.addListener๋ฅผ ์ฌ์ฉํ๋ ๋ฑ ํ๋ฉด์ ํฌ์ปค์ค์ ์กํ์ ๋, ํฌ์ปค์ค ์์ ๋์ ๋๋ง ์ํ๋ ์ฝ๋๋ฅผ ์คํํ ์ ์์๋ค. ์ํ ์ ๋ฐ์ดํธ๋ก ์ธํ ๋ฆฌ๋ ๋๋ง ์์๋ ์ฝ๋๊ฐ ์คํ๋์ง ์์๋ค.
useEffect๋ฅผ ์ฌ์ฉํด ์ปดํฌ๋ํธ ๋ง์ดํธ ์์ addListener๋ฅผ ๋ถ์ฌ์คฌ๋ค.
useEffect(() => {
navigation.addListener('focus', e => {
setFocus(true);
getLocationUpdates();
});
navigation.addListener('blur', e => {
setFocus(false);
removeLocationUpdates();
});
}, [navigation]);
์ฝ๋ ์ ๋ฌธ
const [time, setTime] = useState(moment.duration(0, 'seconds'));
const [focus, setFocus] = useState(true);
const tick = () => {
setTime(prevTime => prevTime.clone().add(1, 'seconds'));
};
const timer = useInterval(() => {
if (focus) {
tick();
}
}, 1000);
if (!focus) {
clearInterval(timer);
}
useEffect(() => {
navigation.addListener('focus', e => {
setFocus(true);
getLocationUpdates();
});
navigation.addListener('blur', e => {
setFocus(false);
removeLocationUpdates();
});
}, [navigation]);
๋ฆฌํฉํ ๋ง์ ๋ํ ๋์ฆ๋, ํ ๋งํ ์ฌ์ ๋ ์๋ค๋ ๊ฒ ์ด๋ฐ ํ์ ์ ์์ฌ์์ธ ๊ฒ ๊ฐ๋ค.
๊ทธ๋๋ ์ด๋ ๊ฒ ์ ๋ฆฌํ๋ ๊ณผ์ ์์ ๋ ๋์ ๋ฐฉ์์ ๋ ์ฌ๋ ค๋ณผ ์ ์๋ ๊ฒ ์ข์๋ฏ ใ
ใ