본문 바로가기
부트캠프교육중/react

[React] react-router-dom 6.4

by 뭉지야 2023. 8. 24.
728x90

Router.tsx

import {createBrowserRouter, Route, Routes} from "react-router-dom";
import Header from "./components/Header";
import Home from "./screens/Home";
import About from "./screens/About";
import Root from "./Root"

const router = createBrowserRouter([
    {
        path:"/",
        element: <Root />,
        children: [
            {
                path:"about",
                element: <About />
            }
        ]
    }
])

export default router;

index.tsx

import React from 'react';
import ReactDOM from 'react-dom/client';
import { RouterProvider } from "react-router-dom";
import router from './Router';



const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  <React.StrictMode>
    <RouterProvider router={router}/>
  </React.StrictMode>
);

 

Root.tsx

import React from 'react';

function Root() {
  return (
    <div>
      hello
    </div>
  );
}

export default Root;

 


이렇게 해도 about화면이 안뜰거다.

계속 hello만 뜰거다.

about이 뜨게 하려면

 

 

Root.tsx

import React from 'react';
import { Outlet } from 'react-router-dom';

function Root() {
  return (
    <div>
      <Outlet />
    </div>
  );
}

export default Root;

이렇게 Outlet을 넣어야한다.

 

Outlet은 Root화면의 자식들을 render 한다  (위의 코드모양과 함께 기억해두기!)

 


에러창

errorElement: 컴포넌트에 에러가 발생해서 충돌하거나 컴포넌트의 위치를 찾지 못할때 쓰는거

이렇게하면 path를 잘못쳤을때 NotFound창이 뜬다.

 

Router.tsx

import {createBrowserRouter, Route, Routes} from "react-router-dom";
import Header from "./components/Header";
import Home from "./screens/Home";
import About from "./screens/About";
import Root from "./Root"
import NotFound from "./screens/NotFound";

const router = createBrowserRouter([
    {
        path:"/",
        element: <Root />,
        children: [
            {
                path: "",
                element: <Home />,
            },
            {
                path:"about",
                element: <About />
            }
        ],
        errorElement: <NotFound />
    }
])

export default router;

 

NotFound.tsx

function NotFound(){
    return <h1>404 NotFound</h1>
}
export default NotFound;

Router.tsx

import {createBrowserRouter, Route, Routes} from "react-router-dom";
import Header from "./components/Header";
import Home from "./screens/Home";
import About from "./screens/About";
import Root from "./Root"
import NotFound from "./screens/NotFound";
import User from "./screens/users/User";
import Followers from "./screens/users/Followers";

const router = createBrowserRouter([
    {
        path:"/",
        element: <Root />,
        children: [
            {
                path: "",
                element: <Home />,
            },
            {
                path:"about",
                element: <About />
            },
            {
                path:"users/:userId",
                element: <User />,
                children: [
                    {
                        path:"followers",
                        element: <Followers />
                    }
                ]
            }
        ],
        errorElement: <NotFound />
    }
])

export default router;

User.tsx

import { Outlet, useParams, Link } from "react-router-dom";
import { users } from "../../db";

function User(){
    const {userId} = useParams();
    
    return (
    <>
    <h1>User with id {userId} is named: {users[Number(userId) -1].name}</h1>
    <hr/>
    <Link to="followers">See followers</Link>
    <Outlet />
    </>
    )
}
export default User;

# user에 자식이 있으면 Outlet을 사용하는거다.
outlet이 이 스크린의 자식을 render하게 된다.

# /followers하면 localhost:3000/followers로 가고
followers라고 하면 현재 내가 있는 그 URL 다음에 경로를 추가시킬거다.
그래서 localhost:3000/users/1/followers 이렇게 갈거다.


followers에게 context를 보낼거다

 <Link to="followers">See followers</Link>
    <Outlet context={{
        nameOfMyUser: users[Number(userId) -1].name,
    }}/>

 

followers에서는 useOutletContext를 이용해서 context를 받는다!

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

function Followers(){
    const ctx = useOutletContext();
    console.log(ctx)
    return <h1>Followers</h1>
}
export default Followers;

이렇게 하면

{nameOfMyUser: 'lynn'}

이렇게 출력이 된다.

728x90

'부트캠프교육중 > react' 카테고리의 다른 글

[React] useRouteMatch, useMatch  (0) 2023.08.25
[React] theme, globalstyled  (0) 2023.08.24
[React] react memo  (0) 2023.08.24
[Recoil] atom, selector  (0) 2023.08.23
[React] dark모드, white모드의 첫걸음  (0) 2023.08.18