์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- ๋คํธ์ํฌ
- cs #๋คํธ์ํฌ
- #ํ๋ก์ ํธ์บ ํ #ํ๋ก์ ํธ์บ ํํ๊ธฐ #์ ๋ฐ๋ฏธ #์ค๋์ดํผํฉํ ๋ฆฌ #์ ์ง์ฝํฌ๋น #์ธ์ฌ์ด๋์์ #IT๊ฐ๋ฐ์บ ํ #๊ฐ๋ฐ์๋ถํธ์บ ํ #๋ฆฌ์กํธ #react #๋ถํธ์บ ํ #๋ฆฌ์กํธ์บ ํ
- ๋ฉ๋ชจ๋ฆฌ
- ํ๋ก์ ํธ์บ ํ
- IT๊ฐ๋ฐ์บ ํ
- ์ค๋ ๋
- ๊ฐ๋ฐ์๋ถํธ์บ ํ
- javascript
- html
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ค๋์ดํผํฉํ ๋ฆฌ
- BFS
- react-query
- typescript
- ๋ฆฌ์กํธ
- ์๋ฐ์คํฌ๋ฆฝํธ
- ํ์ ์คํฌ๋ฆฝํธ
- ํ๋ก์ธ์ค
- React.js
- ์ ์ง์ฝํฌ๋น
- ์๊ณ ๋ฆฌ์ฆ
- CS
- ip
- react
- ์ ๋ฐ๋ฏธ
- ์ธ์ฌ์ด๋์์
- Algorithm
- App Runner
- ํด์
- Today
- Total
Bin's Blog
[React.js] ์ค๋์ ๋๋ฒ๊น ๋ณธ๋ฌธ
1๏ธโฃ UseEffect ์์ JSX
๐ค ๋ฌธ์
UseEffect return ๋ฌธ ์์ JSX๋ฅผ ์กฐ๊ฑด๋ฌธ์ ์ด์ฉํด์ ์ฌ์ฉํ๊ณ ์ถ์๋๋ฐ... ํจ์ ์์ฒด๊ฐ ๋์๊ฐ์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๐ ์์ธ
UseEffect์์ return ๋ฌธ์ ์ค์ง cleanup()ํจ์๋ฅผ ์ด์ฉํ ๋๋ง ์ธ ์ ์๋ค. ์ปดํฌ๋ํธ ๋ ๋๋ง์ ํ ๋ ์๋ฌด๋ฐ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
๐ ๏ธ ํด๊ฒฐ
useEffect๊ฐ ์๋ ํจ์ ์ return๋ฌธ์ ์์ฑํด์ ํด๊ฒฐํ๋ค.
2๏ธโฃ ๋น๋๊ธฐ ํธ์ถ๊ณผ UseState() && rendering ๊ณผ์ ์์ router.push() ์ฌ์ฉ
๐ค ๋ฌธ์
Warning: Cannot update a component (Router) while rendering a different component (RequireAuth). To locate the bad setState() call inside RequireAuth, ์ด๋ผ๋ ์๋ฌ๋ฌธ๊ตฌ๊ฐ ๋ด๋ค. ๋ฉ์์ง๋ฅผ ํด์ํ๋ฉด ํ๋์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ํ๋ ๋์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ update๋ฅผ ํ ์ ์๋ค๋ ๋ป์ด๊ณ , ํนํ useState() ํจ์์ ์์น๊ฐ ์ ์ ํ์ง ์๋ค๋ ๊ฒ์ ์์ํ ์ ์๋ค.
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ด ๋๋ฉด ๋ค๋ฅธ ํ์ด์ง๋ฅผ ์ด์ฉํ ์ ์๊ฒ ์ฒ๋ฆฌํ๊ณ ์ถ์๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ณ์ ๋ก๊ทธ์ธ ํ์ด์ง์ ๋จธ๋ฌด๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ๋ ๋๋ง ํ๋ ๋ถ๋ถ์ router.push()๋ฅผ ์ฌ์ฉํ๋๋ฐ ๊ทธ๊ฒ ๋ฌธ์ ๊ฐ ๋๋ค.
๐ ์์ธ
1. onAuthStateChanged ๋ฉ์๋๋ ๋น๋๊ธฐ์ ์ผ๋ก ํธ์ถ๋๋๋ฐ ์ฝ๋ฐฑ ๋ด๋ถ์์ useState()ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ ๋ ๋๋ง ํ๋ ๊ณผ์ ์์ ์ํ ์ ๋ฐ์ดํธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
2. ํ๋ฉด์ ๋ ๋๋งํ๋ ๊ณผ์ ์์ router.push()๋ฅผ ์ด์ฉํด์ ๋ค๋ฅธ ํ์ด์ง๋ก ๋๊ฒจ์ฃผ๋ ค๊ณ ํ๋ค๋ณด๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๐ ๏ธ ํด๊ฒฐ
1. useState()ํจ์๋ฅผ ํ๋ ๋ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋ค ๋๊ณ ๋์ ํ๋ฉด์ด ๋ ๋๋ง์ด ๋ ์ ์๊ฒ ์ฒ๋ฆฌํ๋ค.
2. useEffect()ํจ์๋ฅผ ํ์ฉํด์ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ก๊ทธ์ธ์ด ๋์์๋ ๋ค์ ํ์ด์ง๋ก ์ด๋ํ ์ ์๊ฒ ์ฒ๋ฆฌํ๋ค.
๐ ์์ ์ ์ฝ๋
export default function RequireAuth({
children,
}: {
children: React.ReactNode;
}) {
const router = useRouter();
useEffect(() => {
auth.onAuthStateChanged(user => {
if (user) {
router.push("/community");
return (
<>
<Navbar />
<Tab />
{children}
<Footer />
</>
)
} else {
router.push("/");
return (
<>{children}</>
)
}
});
}, []);
๐ ์์ ํ ์ฝ๋
export default function RequireAuth({
children,
}: {
children: React.ReactNode;
}) {
const router = useRouter();
const [authenticated, setAuthenticated] = useState(false);
const [loading, setLoading] = useState(true);
useEffect(() => {
const unsubscribe = auth.onAuthStateChanged(user => {
if (user) {
setAuthenticated(true);
} else {
setAuthenticated(false);
}
setLoading(false);
});
// unmounted ๋์ ๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ cleanup()ํจ์ ์ฌ์ฉ
return () => {
unsubscribe();
}
}, []);
useEffect(() => {
// ๋ก๊ทธ์ธ์ด ๋์ง ์์๊ฑฐ๋ ๋ก๋ฉ์ด ์ ๋ผ๋ฉด ๊ณ์ ๋ก๊ทธ์ธ ํ์ด์ง
if (!loading && !authenticated) {
router.push("/");
} else {
// ์ฑ๊ณต์ ์ปค๋ฎค๋ํฐ ํ์ด๋ก ์ด๋
router.push("/community")
}
}, [loading, authenticated]);
// ๋ก๋ฉ ์ํ๋ฉด Loading Spinner ์ฌ์ฉ
if (loading) {
<LoadingSpinner />
} else {
if (authenticated) {
return (
<>
<Navbar />
<Tab />
{children}
<Footer />
</>
)
} else {
return (
<>
{children}
</>
)
}
}
}
'React.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React-Query๋?(1ํธ) (0) | 2023.09.11 |
---|---|
Flux ํจํด (0) | 2023.09.01 |
์ค๋์ React (0) | 2023.07.14 |
์ค๋์ React (0) | 2023.05.21 |
์ค๋์ React (0) | 2023.05.14 |