Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 변수
- react-router-dom
- github
- node
- JavaScript
- frontend
- 프론트엔드
- max-width
- HTML
- node.js
- 자바문제풀이
- TypeScript
- react
- 반응형 페이지
- 코드업
- Servlet
- redux
- webpack
- cleancode
- @media
- JS
- coding
- 코딩테스트
- 그럼에도불구하고
- 그럼에도 불구하고
- 자바
- git
- media query
- CSS
- java
Archives
- Today
- Total
그럼에도 불구하고
[Router] loader와 useLoaderData 본문
오늘은 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
'React > Router' 카테고리의 다른 글
[Router] action과 Form, useActionData 그리고 redirect (0) | 2023.06.12 |
---|---|
[Router] loader의 error 처리 with useRouterError & json (0) | 2023.06.10 |
[Router] useParams 사용하기 (0) | 2023.06.10 |
[Router] Link와 Outlet (0) | 2023.06.09 |
[Router] RouterProvider와 CreateBrowserRouter (0) | 2023.06.09 |
Comments