| | |

Redux Toolkit 23 ⚛️ Cheatsheet — Quick Reference

⏱️ Estimated read: 4 min | |

A compact reference for the Redux Toolkit series. Tables only, no prose. Use it during slice authoring, store configuration, and component integration.


Installation

PackagePurpose
@reduxjs/toolkitCore: configureStore, createSlice, createAsyncThunk
react-reduxProvider, useSelector, useDispatch
@reduxjs/toolkit/query/reactRTK Query hooks
mswNetwork mocking in tests
vitest or jestTest runner

Store Setup

ItemSyntax
Create storeconfigureStore({ reducer: { slice: sliceReducer } })
Root state typeReturnType<typeof store.getState>
Dispatch typetypeof store.dispatch
Add middlewaregetDefaultMiddleware().concat(custom)
Prepend middlewaregetDefaultMiddleware().prepend(custom)
DevToolsEnabled by default in development
Provider<Provider store={store}>{children}</Provider>

createSlice

ItemSyntax
CreatecreateSlice({ name, initialState, reducers, extraReducers })
Action creatorsslice.actions.actionName
Reducerslice.reducer
Immer mutationstate.value += 1 (no return needed)
Return new statereturn { ...state, value: 0 }
Payload typePayloadAction<T>
No payloadaction: PayloadAction
Prepare callbackreducers: { add: { reducer, prepare } }

Reducers

PatternExample
Direct mutationstate.items.push(action.payload)
Filterstate.items = state.items.filter((i) => i.id !== action.payload)
Find and updateconst t = state.items.find((i) => i.id === id); if (t) t.done = true
Resetreturn initialState
Nested updatestate.user.profile.name = action.payload

createAsyncThunk

ItemSyntax
CreatecreateAsyncThunk('typePrefix', payloadCreator)
Payload creatorasync (arg, thunkApi) => { return data }
thunkApi.getStategetState()
thunkApi.dispatchdispatch(action)
thunkApi.rejectWithValuerejectWithValue(errorPayload)
Pending actionthunk.pending(requestId)
Fulfilled actionthunk.fulfilled(payload, requestId)
Rejected actionthunk.rejected(error, requestId)
Dispatchdispatch(thunk(arg))
Unwrapawait dispatch(thunk(arg)).unwrap()

Async Thunk Generics

ParameterPurposeInferred
ReturnedResolved valueFrom payload creator return
ThunkArgDispatch argumentFrom first parameter
ThunkApiConfigstate, dispatch, extra, rejectValueNo
Config fieldPurpose
stateTypes getState()
dispatchTypes thunkApi.dispatch
extraTypes thunkApi.extra
rejectValueTypes rejectWithValue payload

extraReducers

Builder methodPurpose
.addCase(actionCreator, reducer)Handle a specific action
.addMatcher(matcher, reducer)Handle actions matching a predicate
.addDefaultCase(reducer)Handle unmatched actions
extraReducers: (builder) => {
  builder
    .addCase(fetchTodos.pending, (state) => { state.status = 'loading' })
    .addCase(fetchTodos.fulfilled, (state, action) => { state.items = action.payload })
    .addCase(fetchTodos.rejected, (state, action) => { state.error = action.error.message })
}

RTK Query

ItemSyntax
Create APIcreateApi({ reducerPath, baseQuery, endpoints })
Base queryfetchBaseQuery({ baseUrl })
Query endpointbuilder.query({ query: (arg) => '/path' })
Mutation endpointbuilder.mutation({ query: (body) => ({ url, method: 'POST', body }) })
Generated hookuseGetXQuery, useUpdateXMutation
Reducerapi.reducer
Middlewareapi.middleware
Tag typestagTypes: ['Todo']
InvalidateinvalidatesTags: ['Todo']
Provide tagprovidesTags: ['Todo']

RTK Query Hooks

Hook fieldMeaning
dataCurrent data
isLoadingInitial load, no cache
isFetchingRe-fetch in progress
isSuccessData is available
isErrorRequest failed
errorError object
refetchManual re-fetch
isUninitializedLazy query not triggered

RTK Query Lifecycle

OptionPurpose
pollingIntervalRe-fetch interval (ms)
skipPollingIfUnfocusedPause when tab hidden
skipSkip the query
refetchOnMountOrArgChangeRe-fetch on mount/arg change
keepUnusedDataForCache retention (default 60s)
preferCacheValueLazy trigger uses cache

Lazy Queries and Prefetching

ItemSyntax
Lazy hookconst [trigger, result] = useLazyGetXQuery()
Triggertrigger(arg)
Trigger with cachetrigger(arg, true)
Prefetch hookconst prefetch = usePrefetch('getX')
Prefetch callprefetch(arg)
Initiate thunkdispatch(api.endpoints.getX.initiate(arg))

TypeScript Hooks

HookSyntax (React Redux 9.1+)
SelectoruseSelector.withTypes<RootState>()
DispatchuseDispatch.withTypes<AppDispatch>()
StoreuseStore.withTypes<RootState>()
HookSyntax (pre-9.1)
SelectoruseSelector((s: RootState) => ...)
DispatchuseDispatch<AppDispatch>()

Pre-typed Thunk Helper

// app/withTypes.ts
import { createAsyncThunk } from '@reduxjs/toolkit'
import type { RootState, AppDispatch } from './store'

export const createAppAsyncThunk = createAsyncThunk.withTypes<{
  state: RootState
  dispatch: AppDispatch
  rejectValue: string
}>()
ItemValue
HelpercreateAsyncThunk.withTypes<Config>()
UsagecreateAppAsyncThunk(typePrefix, payloadCreator)
BenefitNo generics at the call site

Selectors

PatternExample
BasicuseAppSelector((state) => state.todos.items)
DeriveduseAppSelector((state) => state.todos.items.filter((t) => !t.completed))
MemoizedcreateSelector([inputSelector], (items) => ...)
Parameterized(id) => (state) => state.todos.items.find((t) => t.id === id)

Middleware

ItemSyntax
Signaturestore => next => action => { ... }
Action type guardisAction(action) (RTK 2.0)
Add after defaultsgetDefaultMiddleware().concat(custom)
Add before defaultsgetDefaultMiddleware().prepend(custom)
Disable serializabilityserializableCheck: false
Ignore action pathsignoredActionPaths: ['payload.date']
Ignore state pathsignoredPaths: ['cache.entries']

Serializability

SerializableNot serializable
undefined, nullDate
boolean, number, stringMap, Set
Plain objectClass instance
ArrayFunction
Promise
Symbol
ConversionReplacement
DateISO string
MapPlain object or entries array
SetArray
Class instancePlain object + selectors
FunctionID or Server Function reference

Testing Slices

TestCode
Initial statereducer(undefined, { type: '@@INIT' })
Sync actionreducer(state, actionCreator(payload))
Thunk pendingreducer(state, thunk.pending('req'))
Thunk fulfilledreducer(state, thunk.fulfilled(data, 'req'))
Thunk rejectedreducer(state, thunk.rejected(error, 'req'))
Assertionexpect(state).toEqual(expected)

Testing Thunks

StepCode
Handlerhttp.get('/api/x', () => HttpResponse.json(data))
ServersetupServer(...handlers)
Before allserver.listen()
After eachserver.resetHandlers()
After allserver.close()
StoreconfigureStore({ reducer: { slice } })
Dispatchawait store.dispatch(thunk(arg))
Assert stateexpect(store.getState().slice.status).toBe('idle')
Assert valueawait store.dispatch(thunk()).unwrap()
Componentawait waitFor(() => screen.getByText(...))

File Structure

src/
├── app/
│   ├── store.ts          # configureStore + RootState + AppDispatch
│   ├── hooks.ts          # useAppSelector, useAppDispatch
│   └── withTypes.ts      # createAppAsyncThunk
├── features/
│   └── todos/
│       ├── todosSlice.ts
│       └── todosSlice.test.ts
├── mocks/
│   ├── handlers.ts       # MSW handlers
│   └── server.ts         # setupServer
└── components/
    └── TodoList.tsx

Common Commands

CommandPurpose
npm install @reduxjs/toolkit react-reduxInstall core packages
npm testRun tests
npx vitestRun Vitest
npx msw init public/Initialize MSW service worker
Redux DevToolsBrowser extension for state inspection

Imports Quick Reference

WhatImport
configureStore@reduxjs/toolkit
createSlice@reduxjs/toolkit
createAsyncThunk@reduxjs/toolkit
createSelector@reduxjs/toolkit
isAction@reduxjs/toolkit
PayloadAction@reduxjs/toolkit
createApi@reduxjs/toolkit/query/react
fetchBaseQuery@reduxjs/toolkit/query/react
Providerreact-redux
useSelectorreact-redux
useDispatchreact-redux
setupServermsw/node
http, HttpResponsemsw

Keywords

Was this helpful?


Stop using slow, ad-bloated tool sites! 🤮

🔎 Search “KandZ Tools” on Google to use many professional utilities for free.

KandZ.me is the ultimate minimalist hub for:
✅ Finance (Mortgage, Interest, Inflation)
✅ Tech (Base64, JSON, Dev Suite, IP)
✅ Health (BMI, BMR, TDEE)
✅ Productivity (Timer, Workspace, QR)

⚡️ Fast & Private
🔒 No data leaves your device
💎 100% Free

🔗 Use it now: https://tools.kandz.me
🔖 Bookmark it—you’ll need it later!