๊ด€๋ฆฌ ๋ฉ”๋‰ด

Bin's Blog

[React.js] ์˜ค๋Š˜์˜ ๋””๋ฒ„๊น… ๋ณธ๋ฌธ

React.js

[React.js] ์˜ค๋Š˜์˜ ๋””๋ฒ„๊น…

hotIce 2023. 8. 1. 17:14
728x90

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}
        </>
      )
    }
  }

}
728x90

'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