---
title: useFetcher
---
# useFetcher
[MODES: framework, data]
## Summary
[Reference Documentation ↗](https://api.reactrouter.com/v7/functions/react_router.useFetcher.html)
Useful for creating complex, dynamic user interfaces that require multiple,
concurrent data interactions without causing a navigation.
Fetchers track their own, independent state and can be used to load data, submit
forms, and generally interact with [`action`](../../start/framework/route-module#action)
and [`loader`](../../start/framework/route-module#loader) functions.
```tsx
import { useFetcher } from "react-router"
function SomeComponent() {
let fetcher = useFetcher()
// states are available on the fetcher
fetcher.state // "idle" | "loading" | "submitting"
fetcher.data // the data returned from the action or loader
// render a form
// load data
fetcher.load("/some/route")
// submit data
fetcher.submit(someFormRef, { method: "post" })
fetcher.submit(someData, {
method: "post",
encType: "application/json"
})
// reset fetcher
fetcher.reset()
}
```
## Signature
```tsx
function useFetcher({
key,
}: {
key?: string;
} = ): FetcherWithComponents> {}
```
## Params
### options.key
A unique key to identify the fetcher.
By default, `useFetcher` generates a unique fetcher scoped to that component.
If you want to identify a fetcher with your own key such that you can access
it from elsewhere in your app, you can do that with the `key` option:
```tsx
function SomeComp() {
let fetcher = useFetcher({ key: "my-key" })
// ...
}
// Somewhere else
function AnotherComp() {
// this will be the same fetcher, sharing the state across the app
let fetcher = useFetcher({ key: "my-key" });
// ...
}
```
## Returns
A [`FetcherWithComponents`](https://api.reactrouter.com/v7/types/react_router.FetcherWithComponents.html) object that contains the fetcher's state, data, and components for submitting forms and loading data.