dev/react

[ react ] react-router-dom v6_v5์™€์˜ ์ฐจ์ด์™€ routing

๋นŒ๋ผ๋„ฌ 2022. 4. 8. 17:53

SPA ์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ํŽ˜์ด์ง€๋Š” ํ•œ ์ข…๋ฅ˜์ด์ง€๋งŒ, ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ ๋กœ๋”ฉ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ํ˜„์žฌ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ํ™”๋ฉด์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.
๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์„ ๋ผ์šฐํŒ…์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ฆฌ์•กํŠธ ์ž์ฒด์— ์ด ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ € API๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ๋”์šฑ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฆฌ์•กํŠธ ๋ผ์šฐํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ ( react-router ), ๋ฆฌ์น˜ ๋ผ์šฐํ„ฐ (reach-router), Next.js ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๊ทธ ์ค‘ ์šฐ๋ฆฌ๋Š” ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด์ž.

๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ๋ผ์šฐํŒ…์„ ์•„์ฃผ ๊ฐ„๋‹จํ•œ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋” ๋‚˜์•„๊ฐ€ ๋‚˜์ค‘์— SSR์„ ํ•  ๋•Œ์—๋„ ๋ผ์šฐํŒ…์„ ๋„์™€์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ œ๊ณตํ•ด์ค€๋‹ค.

react-route ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ๋ฒ•

๋ผ์šฐํ„ฐ๋ฅผ ์ ์šฉํ•ด ๋ณผ ํ”„๋กœ์ ํŠธ์— yarn์„ ์‚ฌ์šฉํ•˜์—ฌ react-router-dom ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์ค€๋‹ค.
$ yarn add react-router-dom

 

ํ”„๋กœ์ ํŠธ์— ๋ผ์šฐํ„ฐ๋ฅผ ์ ์šฉํ•  ๋•Œ๋Š” src/index.js ํŒŒ์ผ์—์„œ react-router-dom์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” BrowserRouter๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ App ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ์ฃผ๋ฉด ๋œ๋‹ค.
BrowserRouter๋ฅผ ํ†ตํ•ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— HTML5์˜ history API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜์ง€ ์•Š๊ณ ๋„ ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ํ˜„์žฌ ์ฃผ์†Œ์— ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ Props๋กœ ์‰ฝ๊ฒŒ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 

๐Ÿงฉ src/index.js

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from "react-router-dom";
import App from "./App";

ReactDOM.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>,
  document.getElementById("root")
);

๐Ÿงฉ Home.js

import React from "react";

const Home = () => {
  return (
    <div>
      <h1>HOME!! ๐Ÿ </h1>
      <p>๊ฐ€์žฅ ๋จผ์ € ๋ณด์ด๋Š” ํŽ˜์ด์ง€</p>
    </div>
  );
};
export default Home;

๐Ÿงฉ About.js

import React from "react";
const About = () => {
  return (
    <div>
      <h1>์†Œ๊ฐœ</h1>
      <p>์ด ํ”„๋กœ์ ํŠธ๋Š” ๋ฆฌ์•กํŠธ๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. </p>
    </div>
  );
};
export default About;

๐Ÿงฉ App.js

import { Route, Routes } from "react-router-dom";
import About from "./route/About";
import Home from "./route/Home";

const App = () => {
  return (
    <div>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />}/>
      </Routes>
    </div>
  );
};

export default App;

์‚ฌ์šฉ์ž๊ฐ€ ์›น ํŽ˜์ด์ง€์— ์ ‘๊ทผํ–ˆ์„๋•Œ ๊ฐ€์žฅ ๋จผ์ € ๋ณด์—ฌ์ฃผ๋Š” ํ™”๋ฉด์ธ Home ์ปดํฌ๋„ŒํŠธ์™€ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ๋ฅผ ์ž‘์„ฑํ•œ ํŽ˜์ด์ง€ About ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋“ค์„ App ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— Route๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•ด์ค€๋‹ค.

 

๐Ÿ‘‰ ์‹คํ–‰ ๊ฒฐ๊ณผ

๐Ÿ‘‰ react-router-dom v5 ๋น„๊ต _ routes

//v5
const App = () => {
  return (
    <div>
        <Route path="/" component={Home} />
        <Route path="/about" component={About}/>
    </div>
  );
};

v5์—์„œ๋Š” ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑ์—ˆ๋Š”๋ฐ, ์ง€๊ธˆ์€ Routes๋กœ ๊ฐ์‹ธ์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค. ๊ธฐ์กด์˜ Switch ์ปดํฌ๋„ŒํŠธ ๋„ค์ด๋ฐ์ด Routes๋กœ ๋ฐ”๋€œ



๐Ÿ‘‰ react-router-dom v5 ๋น„๊ต _ exact
'/about' ๊ฒฝ๋กœ๋กœ ๋“ค์–ด๊ฐ€๋ฉด About ์ปดํฌ๋„ŒํŠธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Home ์ปดํฌ๋„ŒํŠธ๋„ ํ•จ๊ป˜ ๋‚˜ํƒ€๋‚ฌ์—ˆ๋‹ค. '/about' ๊ฒฝ๋กœ๊ฐ€ '/' ๊ทœ์น™์—๋„ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ํ˜„์ƒ์ด๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด v5์—์„œ๋Š” exact๋ผ๋Š” props์— true๋ฅผ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

//v5
const App = () => {
  return (
    <div>
        <Route path="/" component={Home} exact ={true} />
        <Route path="/about" component={About}/>
    </div>
  );
};

์ด๋ ‡๊ฒŒ exact๋ฅผ ํ†ตํ•ด ๋ณต์ˆ˜์˜ ๋ผ์šฐํŒ…์„ ๋ฐฉ์ง€ํ•˜๋„๋ก ํ–ˆ์—ˆ๋Š”๋ฐ v6 ๋ถ€ํ„ฐ๋Š” exact๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  exact ๋Œ€์‹  ์—ฌ๋Ÿฌ ๋ผ์šฐํŒ…์„ ๋งค์นญํ•˜๊ธฐ ์œ„ํ•ด '*'์„ ๋ถ™์ธ๋‹ค.

<Route path="/*" element={<NotFound />} />

 

Link ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ

Link ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ฆญํ•˜๋ฉด ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ ์ด๋™์‹œ์ผœ ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ์ผ๋ฐ˜ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” <a> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ์ „ํ™˜์„ ํ•˜๋Š”๋ฐ, react router ์‚ฌ์šฉ์‹œ์—๋Š” a ํƒœ๊ทธ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. a ํƒœ๊ทธ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋“ค๊ณ  ์žˆ๋˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‘ ๋‚ ๋ฆฌ๊ณ  ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ Œ๋”๋ง ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
Link ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๋ฉด, ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ ์ฑ„๋กœ HTML5 History API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ๋งŒ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.
Link ์ปดํฌ๋„ŒํŠธ ์—ญ์‹œ a ํƒœ๊ทธ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์ง€๋งŒ, ํŽ˜์ด์ง€ ์ „ํ™˜์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค.
<Link to="path">๋‚ด์šฉ </Link>

 

๐ŸงฉApp.js

import { Link, Route, Routes } from "react-router-dom";
import About from "./route/About";
import Home from "./route/Home";
const App = () => {
  return (
    <div>
      <ul>
        <li>
          <Link to ="/">Home</Link>
        </li>
        <li>
          <Link to ="/about">About</Link>
        </li>
      </ul>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />}/>
      </Routes>
    </div>
  );
};

export default App;

๐Ÿ‘‰ ์‹คํ–‰ ๊ฒฐ๊ณผ 

URL ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ฟผ๋ฆฌ

ํŽ˜์ด์ง€ ์ฃผ์†Œ๋ฅผ ์ •์˜ํ•  ๋•Œ ์œ ๋™์ ์ธ ๊ฐ’์„ ์ „๋‹ฌํ•ด์•ผํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ ๋ฐฉ๋ฒ•์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋‹ค.

  • ํŒŒ๋ผ๋ฏธํ„ฐ : 'profiles/pumpkin'
  • ์ฟผ๋ฆฌ : 'profiles?details=true'

์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์จ์•ผํ• ์ง€์— ๋Œ€ํ•œ ๋ฌด์กฐ๊ฑด์ ์ธ ๊ทœ์น™์€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํŠน์ • ์•„์ด๋”” ํ˜น์€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ณ , ์ฟผ๋ฆฌ๋Š” ์–ด๋–ค ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ํŽ˜์ด์ง€์— ํ•„์š”ํ•œ ์˜ต์…˜์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

URL ํŒŒ๋ผ๋ฏธํ„ฐ_useParams()

profile ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด profile/{username} ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ username์„ props๋กœ ๋ฐ›์•„์™€์„œ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

 

๐Ÿงฉ Profiles.js

//v5
const data = {
    pumpkin :{
        name:'ํ˜ธ๋ฐ•์ฟต์•ผ',
        description:'ํ˜ธ๋ฐ•์ฟต์•ผ๋ฅผ ๋‹ฎ์•„์„œ ํ˜ธ๋ฐ•์ฟต์•ผ'
    },
    loveKim :{
        name : '๊น€์‚ฌ๋ž‘',
        description:'ํ˜ธ๋ฐ•์ฟต์•ผ์˜ ๋ง‰๋‚ด ๋™์ƒ'
    }
}
const Profile = ({match})=>{
    const {username} = match.params;
    const profile =data[username]
    if(!profile){
        return <div>์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.</div>
    }
    return(
        <div>
            <h1>์•ˆ๋…•ํ•˜์„ธ์š” {profile.name}๋‹˜!</h1>
            <p>์†Œ๊ฐœ : {profile.description}</p>
        </div>
    )
}
export default Profile

//v6
import React from "react";
import { useParams } from "react-router";
const data = {
  ...
}
const Profile = ()=>{
    const {username} = useParams();
    const profile =data[username]
    if(!profile){
        return <div>์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.</div>
    }
    return(
       ...
    )
}
export default Profile

URL ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ผ์šฐํŠธ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ›์•„์˜ค๋Š” match๋ผ๋Š” ๊ฐ์ฒด ์•ˆ์˜ params ๊ฐ’์„ ์ฐธ์กฐํ•œ๋‹ค. match ์•ˆ์—๋Š” ํ˜„์žฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ค ๊ฒฝ๋กœ ๊ทœ์น™์— ์˜ํ•ด ๋ณด์ด๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.
react-router v6 ๋ถ€ํ„ฐ๋Š” useParams() ๋ผ๋Š” Hook์„ ์‚ฌ์šฉํ•ด ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ฒŒ parmas๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿงฉ App.js

...
import Profile from "./route/Profiles";

const App = () => {
  return (
    <div>
      <ul>
         ...
          <Link to ="/profile/pumpkin">pumpkin์˜ ํ”„๋กœํ•„</Link>
        </li>
        <li>
          <Link to ="/profile/lovekim">lovekim์˜ ํ”„๋กœํ•„</Link>
        </li>
      </ul>
      <Routes>
          ...
        <Route path ="/profile/:username"  element={<Profile />}/>
      </Routes>
    </div>
  );
};

๐Ÿ‘‰ ์‹คํ–‰ ๊ฒฐ๊ณผ

URL ์ฟผ๋ฆฌ

์ด๋ฒˆ์—๋Š” About ํŽ˜์ด์ง€์—์„œ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž. ์ฟผ๋ฆฌ๋Š” location ๊ฐ์ฒด์— ๋“ค์–ด์žˆ๋Š” search ๊ฐ’์—์„œ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. location ๊ฐ์ฒด๋Š” ๋ผ์šฐํŠธ๋กœ ์‚ฌ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ props๋กœ ์ „๋‹ฌ๋˜๋ฉฐ, ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ˜„์žฌ ์ฃผ์†Œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

//http://localhost:3000/about?details=true ์ฃผ์†Œ๋กœ ๋“ค์–ด๊ฐ”์„ ๋•Œ์˜ location ๊ตฌ์กฐ

location : {
    "pathname":"/about",
        "search" : "?details=true",
        "hash" : ""
}

URL ์ฟผ๋ฆฌ๋Š” "?details=true"๊ณผ ๊ฐ™์ด ๋ฌธ์ž์—ด๋กœ ๋˜์–ด ์žˆ๊ณ , ํŠน์ • ๊ฐ’์„ ์ฝ์–ด ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌธ์ž์—ด์„ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ qs ๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

//v5
import React from "react";
import qs from 'qs'

const About = ({location}) => {
  const query = qs.parse(location.search,{
    ignoreQueryPrefix:true //๋ฌธ์ž์—ด ๋งจ ์•ž์˜ '?'๋ฅผ ์ƒ๋žตํ•˜๋Š” ์„ค์ •๊ฐ’
  })
  const showDetail = query.detail ==='true'
  return (
    <div>

      <h1>์†Œ๊ฐœ</h1>
      <p>์ด ํ”„๋กœ์ ํŠธ๋Š” ๋ฆฌ์•กํŠธ๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. </p>
      {showDetail && <p>detail ๊ฐ’์„ true๋กœ ์„ค์ •ํ•˜์…จ๋„ค์š” ๐Ÿ‘</p>}
    </div>
  );
};
export default About;

//v6 
import React, { useMemo } from "react";
import { useLocation } from "react-router";

function useQuery(){
  const {search} = useLocation();
  return useMemo(()=> new URLSearchParams(search), [search])
}


const About = () => {

  let query = useQuery();
  const showDetail = query.get('detail') ==='true'
  return (
   ...
  );
};
export default About;
![](https://images.velog.io/images/a9120a/post/3f92eb1f-dfef-46d2-ada9-98a28e977c4e/q0lj87mz6whntv2zbxdm.png)

https://github.com/remix-run/react-router/blob/main/docs/getting-started/tutorial.md

 

GitHub - remix-run/react-router: Declarative routing for React

Declarative routing for React. Contribute to remix-run/react-router development by creating an account on GitHub.

github.com

https://stackoverflow.com/questions/69832748/error-a-route-is-only-ever-to-be-used-as-the-child-of-routes-element

 

Error "Error: A <Route> is only ever to be used as the child of <Routes> element"

I am trying to use routing for the first time and followed the exact instructions from Udemy: File App.js: import { Route } from "react-router-dom"; import Welcome from "./Pages/Welc...

stackoverflow.com