React Router v6.4부터 loader와 action 기능이 도입되면서 라우트별로 데이터를 로드하고, 폼을 제출하는 등의 작업을 쉽게 처리할 수 있게 되었습니다. 이번 블로그 포스트에서는 loader와 action이 무엇인지, 어떻게 사용하는지, 그리고 실제 예제를 통해 이들의 사용법을 알아보겠습니다.
먼저 React Router를 설치해야 합니다.
npm install react-router-dom
loader와 action을 사용하기 위해서는 라우트를 정의할 때 이들을 설정해주어야 합니다.
import React from 'react';
import {
BrowserRouter as Router,
Routes,
Route,
useLoaderData,
useActionData,
Form
} from 'react-router-dom';
const fetchData = async () => {
const response = await fetch('https://api.example.com/data');
return response.json();
};
const postData = async (data) => {
const response = await fetch('https://api.example.com/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
});
return response.json();
};
const LoaderComponent = () => {
const data = useLoaderData();
return (
<div>
<h1>Loaded Data</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
};
const ActionComponent = () => {
const actionData = useActionData();
return (
<div>
<h1>Form Submission</h1>
{actionData && <pre>{JSON.stringify(actionData, null, 2)}</pre>}
<Form method="post">
<label>
Name:
<input type="text" name="name" />
</label>
<button type="submit">Submit</button>
</Form>
</div>
);
};
const routes = [
{
path: '/load',
element: <LoaderComponent />,
loader: fetchData,
},
{
path: '/action',
element: <ActionComponent />,
action: async ({ request }) => {
const formData = await request.formData();
const data = Object.fromEntries(formData);
return postData(data);
},
},
];
const App = () => (
<Router>
<Routes>
{routes.map((route) => (
<Route
key={route.path}
path={route.path}
element={route.element}
loader={route.loader}
action={route.action}
/>
))}
</Routes>
</Router>
);
export default App;
const LoaderComponent = () => {
const data = useLoaderData();
return (
<div>
<h1>Loaded Data</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
};
useActionData
훅은 라우트 액션 함수가 반환한 데이터를 가져오는 데 사용됩니다const ActionComponent = () => {
const actionData = useActionData();
return (
<div>
<h1>Form Submission</h1>
{actionData && <pre>{JSON.stringify(actionData, null, 2)}</pre>}
<Form method="post">
<label>
Name:
<input type="text" name="name" />
</label>
<button type="submit">Submit</button>
</Form>
</div>
);
};
공식문서