728x90
728x90
React Router의 loader 속성
들어가며
- 리액트 라우터(
react-router-dom
)의loader
속성에 대해 정리해본다.

React Router의 loader
속성
- React Router Version 6 부터 사용할 수 있다.
- 컴포넌트가 랜더링되기 전에 데이터를 가져올 수 있다.
- 로더 함수에서 반환된 데이터는 자동으로 해당 컴포넌트에서 사용할 수 있게 된다.
- 로더는 함수로 정의되며, 해당 함수에서 데이터를 가져와 컴포넌트에 전달한다.
- 로더 함수를 사용하면 컴포넌트가 렌더링되기 전에 데이터를 가져올 수 있어, 컴포넌트가 초기 로딩 상태를 표시하지 않고 바로 데이터를 렌더링할 수 있다.
- 따라서 더 나은 사용자 경험을 제공할 수 있다.
예제 코드
import { RouterProvider, createBrowserRouter } from "react-router-dom"; import HomePage from "./pages/Home"; import EventsPage from "./pages/Events"; import EventDetailPage from "./pages/EventDetail"; import NewEventPage from "./pages/NewEvent"; import EditEventPage from "./pages/EditEvent"; import RootLayout from "./pages/Root"; import EventsRootLayout from "./pages/EventsRoot"; const router = createBrowserRouter([ { path: "/", element: <RootLayout />, children: [ { index: true, element: <HomePage /> }, // path: "" { path: "events", element: <EventsRootLayout />, children: [ { index: true, element: <EventsPage />, loader: async () => { const response = await fetch("http://localhost:8080/events"); if (!response.ok) { } else { const resData = await response.json(); return resData.events; } }, }, // path: "" { path: ":eventId", element: <EventDetailPage /> }, { path: "new", element: <NewEventPage /> }, { path: ":eventId/edit", element: <EditEventPage /> }, ], }, ], }, ]); function App() { return <RouterProvider router={router} />; } export default App;
loader
를 사용할 경우, 다음과 같이Event.js
파일에서 데이터를 불러오는 코드를 작성하지 않아도 된다.
import { useEffect, useState } from "react"; import EventsList from "../components/EventsList"; function EventsPage() { const [isLoading, setIsLoading] = useState(false); const [fetchedEvents, setFetchedEvents] = useState(); const [error, setError] = useState(); useEffect(() => { async function fetchEvents() { setIsLoading(true); const response = await fetch("http://localhost:8080/events"); if (!response.ok) { setError("Fetching events failed."); } else { const resData = await response.json(); setFetchedEvents(resData.events); } setIsLoading(false); } fetchEvents(); }, []); return ( <> <div style={{ textAlign: "center" }}> {isLoading && <p>Loading...</p>} {error && <p>{error}</p>} </div> {!isLoading && fetchedEvents && <EventsList events={fetchedEvents} />} </> ); } export default EventsPage;
- 해당 컴포넌트에서 미리 불러온 데이터를 사용하려면 아래와 같이
useLoaderData
를 import 하여 사용한다.useLoaderData
는loader
를 사용하여 데이터를 불러온 컴포넌트와 동일하거나 하위에 있는 컴포넌트에서만 사용할 수 있다. (해당 컴포넌트의 상위 컴포넌트에서는 사용할 수 없다.)
import { useLoaderData } from "react-router-dom"; import EventsList from "../components/EventsList"; function EventsPage() { const events = useLoaderData(); return <EventsList events={events} />; } export default EventsPage;
참고 사이트
loader v6.24.0 | React Router
reactrouter.com
728x90
728x90
'Programming > React' 카테고리의 다른 글
[React.js] defer() (React Router) (0) | 2024.07.07 |
---|---|
[React.js] useFetcher 훅 (React Router) (0) | 2024.07.07 |
[React.js] json() 유틸리티 함수 (React Router) (0) | 2024.07.05 |
[React.js] useRouterError 훅 (React Router) (0) | 2024.07.05 |
[React.js] 라우터 설정 방법 (React Router) (0) | 2024.07.02 |
[React.js] 리액트에서의 상태 관리 방법 (0) | 2024.06.30 |
[React.js] <form> 요소에서 제출(Submit) 버튼 사용 시 기본 동작 막는 방법 (0) | 2024.06.28 |
[React.js] memo() 사용할 때 주의할 점 (0) | 2024.06.25 |