// useFetcher
- action이나 loader를 트리거하지만 실제로 속한 페이지로 이동하지 않을 때 사용한다.
- action이나 loader를 트리거하지만 route 전환은 이루어지지 않는다.
const fetcher = useFetcher();
const { data, state } = fetcher;
<fetcher.Form></fetcher.Form>
- fetcher 객체는 action이나 loader 의 결과를 받는다.
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import EditEventPage from './pages/EditEvent';
import ErrorPage from './pages/Error';
import EventDetailPage, {
action as deleteEventAction,
loader as eventDetailLoader,
} from './pages/EventDetail';
import EventsPage, { loader as eventsLoader } from './pages/Events';
import EventsRootLayout from './pages/EventsRoot';
import HomePage from './pages/Home';
import NewEventPage from './pages/NewEvent';
import RootLayout from './pages/Root';
import { action as manipulateEventAction } from './components/EventForm';
import NewsletterPage, { action as newsletterAction } from './pages/Newsletter';
const router = createBrowserRouter([
{
path: '/',
element: <RootLayout />,
errorElement: <ErrorPage />,
children: [
{ index: true, element: <HomePage /> },
{
path: 'events',
element: <EventsRootLayout />,
children: [
{
index: true,
element: <EventsPage />,
loader: eventsLoader,
},
{
path: ':eventId',
id: 'event-detail',
loader: eventDetailLoader,
children: [
{
index: true,
element: <EventDetailPage />,
action: deleteEventAction,
},
{
path: 'edit',
element: <EditEventPage />,
action: manipulateEventAction,
},
],
},
{
path: 'new',
element: <NewEventPage />,
action: manipulateEventAction,
},
],
},
{
path: 'newsletter',
element: <NewsletterPage />,
action: newsletterAction,
},
],
},
]);
function App() {
return <RouterProvider router={router} />;
}
export default App;
import NewsletterSignup from '../components/NewsletterSignup';
import PageContent from '../components/PageContent';
function NewsletterPage() {
return (
<PageContent title="Join our awesome newsletter!">
<NewsletterSignup />
</PageContent>
);
}
export default NewsletterPage;
export async function action({ request }) {
const data = await request.formData();
const email = data.get('email');
// send to backend newsletter server ...
console.log(email);
return { message: 'Signup successful!' };
}
import classes from './NewsletterSignup.module.css';
import { useFetcher } from 'react-router-dom';
import { useEffect } from 'react';
function NewsletterSignup() {
const fetcher = useFetcher();
const { data, state } = fetcher;
useEffect(() => {
if (state === 'idle' && data && data.message) {
window.alert(data.message);
}
}, [data, state]);
return (
<fetcher.Form
method="post"
action="/newsletter"
className={classes.newsletter}
>
<input
type="email"
name="email"
placeholder="Sign up for newsletter..."
aria-label="Sign up for newsletter"
/>
<button>Sign up</button>
</fetcher.Form>
);
}
export default NewsletterSignup;
'클라이언트 > React' 카테고리의 다른 글
[리액트(React)] 배포(Deploying) (0) | 2024.02.23 |
---|---|
[리액트(React)] 인증(Authentication) (0) | 2024.02.22 |
[리액트(React)] Router - action (0) | 2024.02.20 |
[리액트(React)] Router - loader (0) | 2024.02.19 |
[리액트(React)] 동적 Route (0) | 2024.02.18 |