๐ŸŒŸ ๋กœ๊ทธ์•„์›ƒ

summereuna๐Ÿฅยท2022๋…„ 3์›” 30์ผ

๐ŸŒŸ Twinkle (React, Firebase)

๋ชฉ๋ก ๋ณด๊ธฐ
10/42

๐Ÿ“/components/Navigation.js

/components/Navigation.js ํŒŒ์ผ ์ƒ์„ฑ ํ›„ <Link to="url">๋‚ด์šฉ</Link>์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งํฌ๋ฅผ ๊ฑด๋‹ค.

์ฝ”๋“œ

import { Link } from "react-router-dom";

const Navigation = () => (
  <nav>
    <ul>
      <li>
        <Link to="/">ํ™ˆ</Link>
      </li>
      <li>
        <Link to="/profile">ํ”„๋กœํ•„</Link>
      </li>
    </ul>
  </nav>
);

export default Navigation;

๐Ÿ“/routes/Profile.js

  1. ์‚ฌ์šฉ์ž๊ฐ€ "/profile"๋กœ ์ด๋™ ์‹œ ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์ž.

firebase์˜ authService.signOut()

  1. ๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด authService.signOut();์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •์„ ๋กœ๊ทธ์•„์›ƒ์‹œํ‚ค๋ฉด ๋œ๋‹ค.

react-router-dom์˜ useNavigate()

  1. ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •์„ ๋กœ๊ทธ์•„์›ƒ์‹œํ‚จ ํ›„, ๊ทธ๋ƒฅ ๋‘๋ฉด "/profile" ํŽ˜์ด์ง€์— ๋จธ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— "/"์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ด์•ผ ํ•œ๋‹ค.
    ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ ๋”์˜ useNavigate()์„ ์‚ฌ์šฉํ•˜๋ฉด ํ™ˆ์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.
const navigate = useNavigate();
// "/"์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
navigate("/");

์ฝ”๋“œ

import { authService } from "fbase";
import { useNavigate } from "react-router-dom";

export default () => {
  const navigate = useNavigate();
  const onLogOutClick = () => {
    authService.signOut();
    //home์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ์œ„ํ•ด react router dom์˜ useNavigate() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
    navigate("/");
  };

  return (
    <>
      <button onClick={onLogOutClick}>๋กœ๊ทธ์•„์›ƒ</button>
    </>
  );
};

๐Ÿ“/components/Router.js

  1. ์ž‘์„ฑํ•œ Navigation ์ปดํฌ๋„ŒํŠธ์™€ profile ๋ฃจํŠธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
//๐Ÿ”ฅ Navigation ์ปดํฌ๋„ŒํŠธ์™€ profile ๋ฃจํŠธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
import Navigation from "components/Navigation";
import Profile from "routes/Profile";

&&

  1. ๋กœ๊ทธ์ธ์„ ํ–ˆ์„ ๋•Œ๋งŒ ๋„ค๋น„๊ฒŒ์ด์…˜์ด ๋ณด์ด๊ฒŒ ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— isLoggedIn์ด ์ฐธ์ธ ๊ฒฝ์šฐ์—๋งŒ <Navigation />์ด ์žˆ์„ ์ˆ˜ ์žˆ๋„๋ก &&์„ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  <Route />์˜ path์— url์„ ์ ๋Š”๋‹ค.
<Router>
  {/*๐Ÿ”ฅ &&์˜ ์˜๋ฏธ: <Navigation />์ด ์กด์žฌํ•˜๋ ค๋ฉด isLoggedIn์ด ์ฐธ์ด์–ด์•ผ ํ•œ๋‹ค*/}
  {isLoggedIn && <Navigation />}
  <Routes>
    {/* ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๋ฉด /์œผ๋กœ, ์•„๋‹ˆ๋ฉด /login์œผ๋กœ */}
    {isLoggedIn ? (
      <>
        <Route path="/" element={<Home />}></Route>
        <Route path="/profile" element={<Profile />}></Route>
        </>
    ) : (
      <Route path="/" element={<Auth />}></Route>
    )}
  </Routes>
</Router>

<Route path="*" element={<Navigate replace to="/" />} />

  1. ์ •ํ•ด์ง„ url์™ธ์— ๋‹ค๋ฅธ url๋กœ ์ ‘๊ทผ์‹œ ๋ชจ๋‘ "/"๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๊ธฐ ์œ„ํ•ด <Redirect from="*" to="/" />๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ React v.6 ์—์„œ๋Š” <Redirect />๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค๊ณ  ํ•œ๋‹ค..๐Ÿ˜ฎ
  • Routes ์•ˆ์—๋Š” Route๋งŒ ๋„ฃ๊ธฐ๋ฅผ ๊ถŒ์žฅ
  • <Redirect /> ๋Œ€์‹  <Route />์˜ element ์†์„ฑ์œผ๋กœ <Navigate replace to="url"/>์„ ์‚ฌ์šฉ
<Route path="*" element={<Navigate replace to="/" />} />

๋จผ์ € <Route />์˜ element ์†์„ฑ์œผ๋กœ <Navigate replace to="url"/>์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด react-router-dom์—์„œ Navigate์„ ์ž„ํฌํŠธ ํ•œ๋‹ค.

import {
  BrowserRouter as Router,
  Routes,
  Route,
  //๐Ÿ”ฅ <Route />์˜ element ์†์„ฑ์œผ๋กœ <Navigate replace to="url"/>์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด react-router-dom์—์„œ Navigate์„ ์ž„ํฌํŠธ ํ•œ๋‹ค.
  Navigate,
} from "react-router-dom";

๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ <Route />์˜ element ์†์„ฑ์œผ๋กœ <Navigate replace to="url"/>์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ•ด์ง„ url์™ธ์— ๋‹ค๋ฅธ url๋กœ ์ ‘๊ทผ์‹œ ๋ชจ๋‘ "/"๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๋ฉด ๋œ๋‹ค.

์ฝ”๋“œ

import React from "react";
import {
  BrowserRouter as Router<,
  Routes,
  Route,
  //๐Ÿ”ฅ React Router v.6 ๋ถ€ํ„ฐ๋Š” <Redirect /> ๋Œ€์‹  <Route />์˜ element ์†์„ฑ์œผ๋กœ <Navigate replace to="url"/>์„ ์‚ฌ์šฉํ•œ๋‹ค.
  Navigate,
} from "react-router-dom";
//์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ๋ฐ”๊ฟˆ
import Auth from "routes/Auth";
import Home from "routes/Home";
//๐Ÿ”ฅ Navigation ์ปดํฌ๋„ŒํŠธ์™€ profile ๋ฃจํŠธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
import Navigation from "components/Navigation";
import Profile from "routes/Profile";

//App์—์„œ AppRouter๋กœ ๋ณด๋‚ธ prop์ธ isLoggedIn ๋ฐ›๊ธฐ
const AppRouter = ({ isLoggedIn }) => {
  return (
    <Router>
      {/*๐Ÿ”ฅ &&์˜ ์˜๋ฏธ: <Navigation />์ด ์กด์žฌํ•˜๋ ค๋ฉด isLoggedIn์ด ์ฐธ์ด์–ด์•ผ ํ•œ๋‹ค*/}
      {isLoggedIn && <Navigation />}
      <Routes>
        {/* ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๋ฉด /์œผ๋กœ, ์•„๋‹ˆ๋ฉด /login์œผ๋กœ */}
        {isLoggedIn ? (
          <>
            <Route path="/" element={<Home />}></Route>
            <Route path="/profile" element={<Profile />}></Route>
            {/*๐Ÿ”ฅ ์ •ํ•ด์ง„ url์™ธ์— ๋‹ค๋ฅธ url๋กœ ์ ‘๊ทผ์‹œ ๋ชจ๋‘ "/"๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๊ธฐ*/}
            <Route path="*" element={<Navigate replace to="/" />} />
          </>
        ) : (
          <>
            <Route path="/" element={<Auth />}></Route>
            {/*๐Ÿ”ฅ ์—ฌ๊ธฐ๋„*/}
            <Route path="*" element={<Navigate replace to="/" />} />
          </>
        )}
      </Routes>
    </Router>
  );
};

export default AppRouter;
profile
Always have hope๐Ÿ€ & constant passion๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€