그럼에도 불구하고

👨‍💻

[Router] loader와 useLoaderData 본문

React/Router

[Router] loader와 useLoaderData

zenghyun 2023. 6. 10. 09:37

목차

    오늘은 loader와 useLoaderData에 대해 알아보겠습니다.

     

     

    [ loader ]

    서버에 요청하지 않고 데이터를 가능한 한 빨리 가져오기 위해 react router dom 6.4v 부터는 client side browser를 제공하고 있습니다. 즉, 서버에 요청하지 않고 클라이언트 사이드에서 처리하기 때문에 속도 면에서 엄청난 이점이 생기게 됩니다. 

     

    여기서 추가된 기능 중 하나인 loader는 컴포넌트가 생성되기 전에 컴포넌트에 데이터를 전달하는 역할을 수행합니다.

     

    loader의 특징 

    - loader의 호출 시점은 컴포넌트가 렌더링 되기 전 입니다.

    - 각 파일에 loader라는 함수를 만든뒤 이를 export하여 사용하는 것이 일반적입니다. 

    - loader 함수가 값을 return하면 useLoaderData()로 컴포넌트에서 데이터를 받을 수 있습니다.

    - GET 요청을 하면 loader가 호출됩니다. 

     

     

    📌 App.js

     

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    import { createBrowserRouter, RouterProvider } from "react-router-dom";
     
    import RootLayout from "./pages/Roots";
    import HomePage from "./pages/HomePage";
    import Events from "./pages/Events";
    import EventDetailPage from "./pages/EventDetailPage";
    import NewEventPage from "./pages/NewEventPage";
    import EditEventPage from "./pages/EditEventPage";
    import EventsRootLayout from "./pages/EventsRoot";
     
    const router = createBrowserRouter([
      {
        path: "/",
        element: <RootLayout />,
        children: [
          { index: true, element: <HomePage /> },
          {
            path: "events",
            element: <EventsRootLayout />,
            children: [
              {
                index: true,
                element: <Events />,
                loader: async () => {
                  const response = await fetch("http://localhost:8080/events");
     
                  if (!response.ok) {
                  } else {
                    const resData = await response.json();
                    return resData.events;
                  }
                },
              },
              { path: "/events/:eventId", element: <EventDetailPage /> },
              { path: "/events/new", element: <NewEventPage /> },
              { path: "events/:eventId/edit", element: <EditEventPage /> },
            ],
          },
        ],
      },
    ]);
     
    function App() {
      return <RouterProvider router={router} />;
    }
     
    export default App;
     
    cs

     

    1
    2
    3
    4
    5
    6
    7
    8
     loader: async () => {
                  const response = await fetch("http://localhost:8080/events");
                  if (!response.ok) {
                  } else {
                    const resData = await response.json();
                    return resData.events;
                  }
               }
    cs

     

     

    📌 Events.js

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import { useLoaderData } from "react-router-dom";
     
    import EventsList from "../components/EventsList";
     
    function EventsPage() {
      const events = useLoaderData();
      /*
      useLoaderData는 내가 loader를 사용한 컴포넌트, 
      즉 동등 수준의 컴포넌트나 그 자식에 해당하는 컴포넌트에서만 사용할 수있다. 
       */
     
      return <EventsList events={events} />;
    }
     
    export default EventsPage;
     
    cs

     

    여기서 중요한 점은 useLoaderData는 내가 loader를 사용한 컴포넌트, 즉 동등 수준의 컴포넌트나 그 자식에 해당하는 컴포넌트에서만 사용할 수 있습니다. 

     

    내가 loader를 사용한 컴포넌트보다 상위 컴포넌트에서는 사용할 수 없습니다.

     

    ref: https://bbeeyaks-moment.tistory.com/entry/react-React-Router-v64-loaderactionfetchers

    Comments