์ํฉ
๋ง์ดํ์ด์ง๋ฅผ ๊ฐ๋ฐํ๋๋ฐ ์ด์ ํ์ด์ง๊ฐ ์ด๋ ํ์ด์ง์์ ์ง์ ํ๋๋์ ๋ฐ๋ผ ๋ณด์ฌ์ค์ผํ ์ปดํฌ๋ํธ ํ๋๊ฐ ์ฐจ์ด๊ฐ ๋ฌ๋ค. ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ด์ ์ฐ์ ์ฝ๋๊ฐ ๊ฒน์น์ง๋ง ๋ง์ดํ์ด์ง์ ํด๋นํ๋ ํ์ด์ง๋ฅผ ๋ ๊ฐ๋ฅผ ๋ง๋ค์๋ค. ๋ก์ง์ ๋๊ฐ์ง๋ง ์ด์ ํ์ด์ง๊ฐ ์ด๋ค ํ์ด์ง์ธ์ง ์ ๋ณด๋ง ์๋ค๋ฉด ๋ง์ดํ์ด์ง ์ปดํฌ๋ํธ๋ฅผ ๋๊ฐ ๋ง๋ค ํ์๊ฐ ์ ํ ์์ด๋ณด์๋ค.
๋ด์ ๋ณด ํ์ด์ง์ ๋ก์ง์ ์๋์ ๊ฐ๋ค.
์ด์ ํ์ด์ง๊ฐ ์์ ์๋ฃ ํ์ด์ง๋ผ๋ฉด? ๋ด์ ๋ณด ํ์ด์ง + ํ ์คํธ ์ปดํฌ๋ํธ
์ด์ ํ์ด์ง๊ฐ ๊ทธ ์ธ์ ํ์ด์ง๋ผ๋ฉด? ๊ทธ๋ฅ ๋ด์ ๋ณด ํ์ด์ง
๋ฌธ์
๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ <MyPage> ํ์ด์ง ์ปดํฌ๋ํธ์ Props๋ก ์กฐ๊ฑด์ ๋ด๋ ค์ฃผ์ด ์ํ๋ ์กฐ๊ฑด๋๋ก ๋ค๋ฅธ ๋ ๋ฐฉํฅ์ผ๋ก <MyPage>๋ฅผ ๋์์ค ์ ์์๊น? ๋ผ๊ณ ์๊ฐ์ ํ์๋๋ฐ, ์ ์ด์ react-router-dom์ useNavigate() hook์ ์ฌ์ฉํด์ ๋ง์ดํ์ด์ง๋ก์ ํ์ด์ง ์ ํ์ ๊ตฌํํ๊ธฐ ๋๋ฌธ์,MyPage ์ปดํฌ๋ํธ์ ํด๋นํ๋ path๋ก ์ด๋์ ํด๋ฒ๋ฆฌ๋ฉด, ์๋ฅผ๋ค๋ฉด navigate("/mypage") ์ด๋ฐ ์์ผ๋ก ํ์ด์ง ์ ํ์ ํ ํ ๋ฐ ์ด๋ป๊ฒ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์์ Props๋ฅผ ๋ณด๋ผ ์ ์๋ค๋ ๊ฒ์ธ์ง? ์ ๋ํ ๋ถ๋ถ์ด์๋ค. ๊ทธ๋์... useNavigate๋ฅผ ํธ์ถํ ๋ ํ์คํ ๋ฆฌ๋ง ์ ์ฅํด๋ ์ ์๋ค๋ฉด? ์ฆ, ๋ง์ด ํ์ด์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด ์ด์ ํ์ด์ง๊ฐ ์ด๋ค ํ์ด์ง์ธ์ง๋ง ์ ๋ณด๋ฅผ ์๊ณ ์์ผ๋ฉด ํด๊ฒฐ์ด ๋ ๊ฒ ๊ฐ์ ๋ฌธ์ ์๋ค.
ํด๊ฒฐ
ํด๊ฒฐ์ฑ ์ react-router-dom์ ์์๋ค.
ํ์ด์ง ์ ํ์ ์ํด ์ฌ์ฉํ ๋ผ์ฐํฐ์ useNavigate ํ ์ผ๋ก ํ์ด์ง ์ ํ์ ํ์ฌ ํ์ด์ง์ ์ ๋ณด๋ฅผ state๋ผ๋ ์ต์ ์ ์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ์ ํ๋ ํ์ด์ง์์๋ useLocation์ด๋ผ๋ ํ ์ผ๋ก ์ ์ฅ๋์ด์๋ state ๊ฐ์ ๊ฐ์ ธ์ฌ ์๊ฐ ์๋ค.
react-router-dom์ navigate hook ์ ์ฌ์ฉํด์ ์ง์ ํด์จ ํ์ด์ง๋ฅผ
์ด๋ํ ํ์ด์ง์์๋ useLocation์ ์ฌ์ฉํด์ navigate๋ก ํ์ด์ง๊ฐ ์ ํ๋์ด๋ ์ ์ฅ๋ state ๊ฐ์ ๋ฐ์์ฌ ์ ์์ด ์ด์ ํ์ด์ง๊ฐ ์ด๋ค ํ์ด์ง์ธ์ง ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค.
useNavigate() ์ฌ์ฉํด์ ๋ค์ ํ์ด์ง๋ก ์ ํ
import { useNavigate } from 'react-router-dom';
export const MyInfoEdit = () => {
const navigatge = useNavigate();
const handleClickEditDone = () => {
navigate('/myinfo', { state: 'nameEdit' });
};
return (
<Button variant='contained' fullWidth onClick={handleClickEditDone}>
์์ ์๋ฃ
</Button>
);
};
์์ ์๋ฃ ๋ฒํผ์ ๋๋ฅด๋ฉด, navigate hook์ ์ฌ์ฉํด์ /myinfo ๊ฒฝ๋ก์ธ <MyInfo /> ํ์ด์ง ์ปดํฌ๋ํธ๋ก ์ด๋ํ๊ณ , ์ด๋ ํ์ฌ ์ํ์ธ 'nameEdit'์ ์ํ๋ฅผ state ์ต์ ๊ฐ์ผ๋ก ์ถ๊ฐํ๋ค.
useLocation() ์ผ๋ก ์ฑ์ด ์ด๋ค ํ์ด์ง์์ ์๋์ง ํ์ธ
import { useLocation } from 'react-router-dom';
export const MyInfo = () => {
const location = useLocation();
console.log(location, 'location');
const [isEditDoneToastOpen, setIsEditDoneToastOpen] = useState(false);
const onCloseEditDoneToast = (
event: React.SyntheticEvent | Event,
reason?: string,
) => {
if (reason === 'clickaway') {
return;
}
setIsEditDoneToastOpen(false);
};
//์ด์ ์ง์
ํ์ด์ง๊ฐ ์์ ํ์ด์ง ์๋ค๋ฉด Snackbar ํ ์คํธ ๋์ฐ๊ธฐ
useEffect(() => {
if (location.state) {
setIsEditDoneToastOpen(true);
}
}, []);
return (
<PageLayout
titleBoxTitle={<>๋ด ์ ๋ณด</>}>
<Snackbar
anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}
open={isEditDoneToastOpen}
autoHideDuration={3000}
onClose={onCloseEditDoneToast}>
<Alert
severity='success'
>
{location.state === 'nameEdit' && '๋ด ์ ๋ณด ์์ ์๋ฃ'}
</Alert>
</Snackbar>
</PageLayout>
);
};
์ด์ MyInfo ํ์ด์ง์์ useLocation ํ ์ ์ฌ์ฉํด ์ ์ฅ๋์ด ์๋ state ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์๊ฐ ์๋ค.
useLocation() ์ location ์ด๋ผ๋ ๋ณ์์ ํ ๋นํด์ฃผ๊ณ , location.state ๊ฐ์ ํ์ธํด์ ๊ทธ ๊ฐ์ด ์๋ค๋ฉด? ์ด์ ํ์ด์ง์์ history ๋ฅผ ์ ์ฅํด์ ์ด ํ์ด์ง๋ก ๋ณด๋ธ ๊ฒ์ด๋ฏ๋ก, ์ด์ ํ์ด์ง๊ฐ ์ด๋ค ํ์ด์ง ์๋์ง๊น์ง state ๊ฐ์ ํ์ธํ ์๊ฐ ์๋ค.
๊ฒฐ๋ก
ํ์ด์ง ์ ํ์ navigate๋ฅผ ์ฌ์ฉํ ๋ ํ์ฌ ํ์ด์ง์ history ์ ๋ณด๋ฅผ useNavigate ๊ฐ์ฒด์ ๊ตฌํ๋ state ์ ์ ์ฅํ ์ ์๋ค.
useNavigate๋ก ํ์ด์ง ์ ํ์ ํ์ฌ ์์น ํ์ด์ง๋ฅผ state๋ก ์ฃผ๊ณ , ์ ํ๋ ํ์ด์ง์์๋ useLocation์ผ๋ก ์ด์ ํ์ด์ง state ๊ฐ์ ๋ฐ์์ค๋ ๊ฒ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
์ฐธ๊ณ
https://reactrouter.com/en/6.17.0/hooks/use-navigate