Skip to content

Commit 55309f3

Browse files
committed
Merge branch 'feature/v1.6-integration' of github.com:reduxjs/redux-toolkit into feature/v1.6-integration
2 parents 4a3cecd + 8cd2545 commit 55309f3

File tree

14 files changed

+615
-262
lines changed

14 files changed

+615
-262
lines changed

docs/api/rtk-query/createApi.mdx

Lines changed: 336 additions & 147 deletions
Large diffs are not rendered by default.

docs/api/rtk-query/created-api/hooks.mdx

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -267,11 +267,12 @@ type UseQueryResult<T> = {
267267
startedTimeStamp?: number // Timestamp for when the query was initiated
268268
fulfilledTimeStamp?: number // Timestamp for when the query was completed
269269

270-
isUninitialized: false // Query has not started yet.
271-
isLoading: false // Query is currently loading for the first time. No data yet.
272-
isFetching: false // Query is currently fetching, but might have data from an earlier request.
273-
isSuccess: false // Query has data from a successful load.
274-
isError: false // Query is currently in an "error" state.
270+
// Derived request status booleans
271+
isUninitialized: boolean // Query has not started yet.
272+
isLoading: boolean // Query is currently loading for the first time. No data yet.
273+
isFetching: boolean // Query is currently fetching, but might have data from an earlier request.
274+
isSuccess: boolean // Query has data from a successful load.
275+
isError: boolean // Query is currently in an "error" state.
275276

276277
refetch: () => void // A function to force refetch the query
277278
}
@@ -316,15 +317,18 @@ type UseMutationTrigger<T> = (
316317
}
317318

318319
type UseMutationResult<T> = {
320+
// Base query state
321+
originalArgs?: unknown // Arguments passed to the latest mutation call
319322
data?: T // Returned result if present
320-
endpointName?: string // The name of the given endpoint for the mutation
321323
error?: unknown // Error result if present
324+
endpointName?: string // The name of the given endpoint for the mutation
322325
fulfilledTimestamp?: number // Timestamp for when the mutation was completed
323-
isError: boolean // Mutation is currently in an "error" state
326+
327+
// Derived request status booleans
328+
isUninitialized: boolean // Mutation has not been fired yet
324329
isLoading: boolean // Mutation has been fired and is awaiting a response
325330
isSuccess: boolean // Mutation has data from a successful call
326-
isUninitialized: boolean // Mutation has not been fired yet
327-
originalArgs?: unknown // Arguments passed to the latest mutation call
331+
isError: boolean // Mutation is currently in an "error" state
328332
startedTimeStamp?: number // Timestamp for when the latest mutation was initiated
329333
}
330334
```

docs/api/rtk-query/fetchBaseQuery.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ hide_table_of_contents: false
88

99
# `fetchBaseQuery`
1010

11-
This is a very small wrapper around `fetch` that aims to simplify requests. It is not a full-blown replacement for `axios`, `superagent`, or any other more heavy-weight library, but it will cover the large majority of your needs.
11+
This is a very small wrapper around [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) that aims to simplify requests. It is not a full-blown replacement for `axios`, `superagent`, or any other more heavy-weight library, but it will cover the large majority of your needs.
1212

1313
It takes all standard options from fetch's [`RequestInit`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch) interface, as well as `baseUrl`, a `prepareHeaders` function, and an optional `fetch` function.
1414

docs/introduction/getting-started.md

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ The **Redux Toolkit** package is intended to be the standard way to write [Redux
1717

1818
We can't solve every use case, but in the spirit of [`create-react-app`](https://github.com/facebook/create-react-app) and [`apollo-boost`](https://dev-blog.apollodata.com/zero-config-graphql-state-management-27b1f1b3c2c3), we can try to provide some tools that abstract over the setup process and handle the most common use cases, as well as include some useful utilities that will let the user simplify their application code.
1919

20-
Redux Toolkit also includes a powerful data fetching and caching capability that we've dubbed "RTK Query". It's included in the package as a separate set of entry points. It's optional, but can eliminate the need to hand-write data fetching logic yourself.
20+
Redux Toolkit also includes a powerful data fetching and caching capability that we've dubbed ["RTK Query"](#rtk-query). It's included in the package as a separate set of entry points. It's optional, but can eliminate the need to hand-write data fetching logic yourself.
2121

2222
**These tools should be beneficial to all Redux users**. Whether you're a brand new Redux user setting up your
2323
first project, or an experienced user who wants to simplify an existing application, **Redux Toolkit** can help
@@ -66,6 +66,31 @@ Redux Toolkit includes these APIs:
6666
- [`createEntityAdapter`](../api/createEntityAdapter.mdx): generates a set of reusable reducers and selectors to manage normalized data in the store
6767
- The [`createSelector` utility](../api/createSelector.mdx) from the [Reselect](https://github.com/reduxjs/reselect) library, re-exported for ease of use.
6868

69+
## RTK Query
70+
71+
**RTK Query** is provided as an optional addon within the `@reduxjs/toolkit` package. It is purpose-built to solve the use case of data fetching and caching, supplying a compact, but powerful toolset to define an API interface layer for your app. It is intended to simplify common cases for loading data in a web application, eliminating the need to hand-write data fetching & caching logic yourself.
72+
73+
RTK Query is built on top of the Redux Toolkit core for it's implementation, using [Redux](https://redux.js.org/) internally for it's architecture. Although knowledge of Redux and RTK are not required to use RTK Query, you should explore all of the additional global store management capabilities they provide, as well as installing the [Redux DevTools browser extension](https://github.com/reduxjs/redux-devtools), which works flawlessly with RTK Query to traverse and replay a timeline of your request & cache behavior.
74+
75+
RTK Query is included within the installation of the core Redux Toolkit package. It is available via either of the two entry points below:
76+
77+
```ts no-transpile
78+
import { createApi } from '@reduxjs/toolkit/query'
79+
80+
/* React-specific entry point that automatically generates
81+
hooks corresponding to the defined endpoints */
82+
import { createApi } from '@reduxjs/toolkit/query/react'
83+
```
84+
85+
### What's included
86+
87+
RTK Query includes these APIs:
88+
89+
- [`createApi()`](../api/rtk-query/createApi.mdx): The core of RTK Query's functionality. It allows you to define a set of endpoints describe how to retrieve data from a series of endpoints, including configuration of how to fetch and transform that data.
90+
- [`fetchBaseQuery()`](../api/rtk-query/fetchBaseQuery.mdx): A small wrapper around [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) that aims to simply requests. Intended as the recommended `baseQuery` to be used in `createApi` for the majority of users.
91+
- [`<ApiProvider />`](../api/rtk-query/ApiProvider.mdx): Can be used as a `Provider` if you **do not already have a Redux store**.
92+
- [`setupListeners()`](../api/rtk-query/setupListeners.mdx): A utility used to enable `refetchOnMount` and `refetchOnReconnect` behaviors.
93+
6994
## Help and Discussion
7095

7196
The **[#redux channel](https://discord.gg/0ZcbPKXt5bZ6au5t)** of the **[Reactiflux Discord community](http://www.reactiflux.com)** is our official resource for all questions related to learning and using Redux. Reactiflux is a great place to hang out, ask questions, and learn - come join us!

docs/usage/rtk-query/cached-data.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ RTK Query provides a number of concepts and tools to manipulate the cache behavi
1515

1616
### Tags
1717

18-
_see also: [tagTypes](../../api/rtk-query/createApi#tagtypes)_
18+
_see also: [tagTypes API reference](../../api/rtk-query/createApi.mdx#tagtypes)_
1919

2020
For RTK Query, _tags_ are just a name that you can give to a specific collection of data to control caching and invalidation behavior for refetching purposes. It can be considered as a 'label' attached to cached data that is read after a `mutation`, to decide whether the data should be affected by the mutation.
2121

@@ -25,15 +25,15 @@ An individual `tag` has a `type`, represented as a `string` name, and an optiona
2525

2626
### Providing tags
2727

28-
_see also: [Anatomy of an endpoint](../../api/rtk-query/createApi#anatomy-of-an-endpoint)_
28+
_see also: [providesTags API reference](../../api/rtk-query/createApi.mdx#providestags)_
2929

3030
A _query_ can have it's cached data _provide_ tags. Doing so determines which 'tag' is attached to the cached data returned by the query.
3131

3232
The `providesTags` argument can either be an array of `string` (such as `['Post']`), `{type: string, id?: string|number}` (such as `[{type: 'Post', id: 1}]`), or a callback that returns such an array. That function will be passed the result as the first argument, the response error as the second argument, and the argument originally passed into the `query` method as the third argument. Note that either the result or error arguments may be undefined based on whether the query was successful or not.
3333

3434
### Invalidating tags
3535

36-
_see also: [Anatomy of an endpoint](../../api/rtk-query/createApi#anatomy-of-an-endpoint)_
36+
_see also: [invalidatesTags API reference](../../api/rtk-query/createApi.mdx#invalidatesTags)_
3737

3838
A _mutation_ can _invalidate_ specific cached data based on the tags. Doing so determines which cached data will be either refetched or removed from the cache.
3939

docs/usage/rtk-query/conditional-fetching.mdx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ If you want to prevent a query from automatically running, you can use the `skip
1313

1414
[remarks](docblock://query/react/buildHooks.ts?token=UseQuerySubscriptionOptions.skip)
1515

16+
:::tip
17+
Typescript users may wish to use [`skipToken`](../../api/rtk-query/created-api/hooks.mdx#skiptoken) as an alternative to the `skip` option in order to skip running a query, while still keeping types for the endpoint accurate.
18+
:::
19+
1620
### Example
1721

1822
<iframe

docs/usage/rtk-query/customizing-queries.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ export const { useGetPostsQuery, useGetPostQuery } = api
286286

287287
### Excluding baseQuery with queryFn
288288

289-
Individual endpoints on [`createApi`](../../api/rtk-query/createApi) accept a [`queryFn`](../../api/rtk-query/createApi#anatomy-of-an-endpoint) property which allows a given endpoint to ignore `baseQuery` for that endpoint by providing an inline function determining how that query resolves.
289+
Individual endpoints on [`createApi`](../../api/rtk-query/createApi) accept a [`queryFn`](../../api/rtk-query/createApi#queryfn) property which allows a given endpoint to ignore `baseQuery` for that endpoint by providing an inline function determining how that query resolves.
290290

291291
This can be useful for scenarios where you want to have particularly different behaviour for a single endpoint, or where the query itself is not relevant. Such situations may include:
292292

docs/usage/rtk-query/mutations.mdx

Lines changed: 32 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Unlike `useQuery`, `useMutation` returns a tuple. The first item in the tuple is
1111

1212
Unlike the `useQuery` hook, the `useMutation` hook doesn't execute automatically. To run a mutation you have to call the trigger function returned as the first tuple value from the hook.
1313

14+
See [`useMutation`](../../api/rtk-query/created-api/hooks.mdx#usemutation) for the hook signature and additional details.
15+
1416
```ts title="Example of all mutation endpoint options"
1517
// file: types.ts noEmit
1618
export interface Post {
@@ -68,47 +70,32 @@ const api = createApi({
6870
Notice the `onQueryStarted` method? Be sure to check out how it can be used for [optimistic updates](./optimistic-updates)
6971
:::
7072

71-
### Type interfaces
72-
73-
```ts title="Mutation endpoint definition" no-transpile
74-
export type MutationDefinition<
75-
QueryArg,
76-
BaseQuery extends BaseQueryFn,
77-
TagTypes extends string,
78-
ResultType,
79-
ReducerPath extends string = string,
80-
Context = Record<string, any>
81-
> = BaseEndpointDefinition<QueryArg, BaseQuery, ResultType> & {
82-
type: DefinitionType.mutation
83-
invalidatesTags?: ResultDescription<TagTypes, ResultType, QueryArg>
84-
providesTags?: never
85-
onQueryStarted?(
86-
arg: QueryArg,
87-
{
88-
dispatch,
89-
getState,
90-
queryFulfilled,
91-
requestId,
92-
extra,
93-
getCacheEntry,
94-
}: MutationLifecycleApi
95-
): Promise<void>
96-
onCacheEntryAdded?(
97-
arg: QueryArg,
98-
{
99-
dispatch,
100-
getState,
101-
extra,
102-
requestId,
103-
cacheEntryRemoved,
104-
cacheDataLoaded,
105-
getCacheEntry,
106-
}: MutationCacheLifecycleApi
107-
): Promise<void>
108-
}
109-
```
73+
### Performing Mutations with React Hooks
74+
75+
#### Frequently Used Mutation Hook Return Values
76+
77+
The `useMutation` hook returns a tuple containing a `mutation trigger` function, as well as an object containing properties about the `mutation result`.
78+
79+
The `mutation trigger` is a function that when called, will fire off the mutation request for that endpoint. Calling the `mutation trigger` returns a promise with an `unwrap` property, which can be called to unwrap the mutation call and provide the raw response/error. This can be useful if you wish to determine whether the mutation succeeds/fails inline at the call-site.
80+
81+
The `mutation result` is an object containing properties such as the latest `data` for the mutation request, as well as status booleans for the current request lifecycle state.
82+
83+
Below are some of the most frequently used properties on the `mutation result` object. Refer to [`useMutation`](../../api/rtk-query/created-api/hooks.mdx#usemutation) for an extensive list of all returned properties.
84+
85+
- `data` - The returned result if present.
86+
- `error` - The error result if present.
87+
- `isUninitialized` - When true, indicates that the mutation has not been fired yet.
88+
- `isLoading` - When true, indicates that the mutation has been fired and is awaiting a response.
89+
- `isSuccess` - When true, indicates that the last mutation fired has data from a successful request.
90+
- `isError` - When true, indicates that the last mutation fired resulted in an error state.
91+
92+
:::note
93+
94+
With RTK Query, a mutation does contain a semantic distinction between 'loading' and 'fetching' in the way that a [query does](./queries.mdx#frequently-used-query-hook-return-values). For a mutation, subsequent calls are not assumed to be necessarily related, so a mutation is either 'loading' or 'not loading', with no concept of 're-fetching'.
95+
96+
:::
11097

111-
### Basic Mutation
98+
#### Example
11299

113100
This is a modified version of the complete example you can see at the bottom of the page to highlight the `updatePost` mutation. In this scenario, a post is fetched with `useQuery`, and then a `EditablePostName` component is rendered that allows us to edit the name of the post.
114101

@@ -118,11 +105,12 @@ export const PostDetail = () => {
118105

119106
const { data: post } = useGetPostQuery(id)
120107

108+
// highlight-start
121109
const [
122-
// highlight-next-line
123110
updatePost, // This is the mutation trigger
124-
{ isLoading: isUpdating }, // You can use the `isLoading` flag, or do custom logic with `status`
111+
{ isLoading: isUpdating }, // This is the destructured mutation result
125112
] = useUpdatePostMutation()
113+
// highlight-end
126114

127115
return (
128116
<Box p={4}>
@@ -140,7 +128,9 @@ export const PostDetail = () => {
140128
// highlight-end
141129
)
142130
}}
131+
// highlight-start
143132
isLoading={isUpdating}
133+
// highlight-end
144134
/>
145135
</Box>
146136
)

0 commit comments

Comments
 (0)