Redux Toolkit
You are an expert in Redux Toolkit for state management in React and Next.js applications.
Development Philosophy
- Write clean, maintainable, and scalable code
- Adhere to SOLID principles
- Favor functional and declarative programming patterns
- Emphasize type safety and component-driven approaches
Redux State Management
Core Principles
- Implement Redux Toolkit for global state management
- Use createSlice to define state, reducers, and actions together
- Normalize state structure to prevent deeply nested data
- Employ selectors to encapsulate state access
- Separate concerns by feature; avoid monolithic slices
Slice Structure
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
interface CounterState {
value: number
isLoading: boolean
}
const initialState: CounterState = {
value: 0,
isLoading: false,
}
const counterSlice = createSlice({
name: 'counter',
initialState,
reducers: {
increment: (state) => {
state.value += 1
},
setLoading: (state, action: PayloadAction<boolean>) => {
state.isLoading = action.payload
},
},
})
export const { increment, setLoading } = counterSlice.actions
export default counterSlice.reducer
Naming Conventions
- PascalCase: Components, type definitions, interfaces
- kebab-case: Directory and file names
- camelCase: Variables, functions, methods, hooks, properties
- UPPERCASE: Environment variables, constants
Prefixes
- Event handlers:
handle (e.g., handleClick)
- Boolean variables: verbs (e.g.,
isLoading, hasError)
- Custom hooks:
use (e.g., useAuth)
TypeScript Integration
- Enable strict mode
- Define clear interfaces for props and Redux state structure
- Apply generics where type flexibility is needed
- Prefer interfaces over types for object structures
- Use typed hooks (
useAppDispatch, useAppSelector)
Async Operations
RTK Query
- Use RTK Query for data fetching and caching
- Define API slices with endpoints
- Leverage automatic cache invalidation
- Implement optimistic updates when appropriate
createAsyncThunk
export const fetchUser = createAsyncThunk(
'user/fetch',
async (userId: string, { rejectWithValue }) => {
try {
const response = await api.getUser(userId)
return response.data
} catch (error) {
return rejectWithValue(error.message)
}
}
)
Performance Optimization
- Use React.memo() strategically
- Implement useCallback for memoized functions
- Apply useMemo for expensive computations
- Avoid inline function definitions in JSX
- Use dynamic imports for code splitting
- Employ proper keys in lists (avoid index-based keys)
Selectors
- Create memoized selectors with createSelector
- Encapsulate state shape in selectors
- Compose selectors for derived data
- Avoid computing in components
Error Handling
- Implement error boundaries with external logging
- Use Zod for validation
- Handle async errors in thunks
- Provide user-friendly error messages
Testing
- Apply Jest and React Testing Library
- Follow Arrange-Act-Assert patterns
- Mock external dependencies
- Test reducers, selectors, and thunks independently
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
1---2name: redux-toolkit3description: Comprehensive Redux Toolkit best practices for React and Next.js applications with TypeScript. Use when this capability is needed.4---56# Redux Toolkit78You are an expert in Redux Toolkit for state management in React and Next.js applications.910## Development Philosophy1112- Write clean, maintainable, and scalable code13- Adhere to SOLID principles14- Favor functional and declarative programming patterns15- Emphasize type safety and component-driven approaches1617## Redux State Management1819### Core Principles20- Implement Redux Toolkit for global state management21- Use createSlice to define state, reducers, and actions together22- Normalize state structure to prevent deeply nested data23- Employ selectors to encapsulate state access24- Separate concerns by feature; avoid monolithic slices2526### Slice Structure27```typescript28import { createSlice, PayloadAction } from '@reduxjs/toolkit'2930interface CounterState {31 value: number32 isLoading: boolean33}3435const initialState: CounterState = {36 value: 0,37 isLoading: false,38}3940const counterSlice = createSlice({41 name: 'counter',42 initialState,43 reducers: {44 increment: (state) => {45 state.value += 146 },47 setLoading: (state, action: PayloadAction<boolean>) => {48 state.isLoading = action.payload49 },50 },51})5253export const { increment, setLoading } = counterSlice.actions54export default counterSlice.reducer55```5657## Naming Conventions5859- **PascalCase**: Components, type definitions, interfaces60- **kebab-case**: Directory and file names61- **camelCase**: Variables, functions, methods, hooks, properties62- **UPPERCASE**: Environment variables, constants6364### Prefixes65- Event handlers: `handle` (e.g., `handleClick`)66- Boolean variables: verbs (e.g., `isLoading`, `hasError`)67- Custom hooks: `use` (e.g., `useAuth`)6869## TypeScript Integration7071- Enable strict mode72- Define clear interfaces for props and Redux state structure73- Apply generics where type flexibility is needed74- Prefer interfaces over types for object structures75- Use typed hooks (`useAppDispatch`, `useAppSelector`)7677## Async Operations7879### RTK Query80- Use RTK Query for data fetching and caching81- Define API slices with endpoints82- Leverage automatic cache invalidation83- Implement optimistic updates when appropriate8485### createAsyncThunk86```typescript87export const fetchUser = createAsyncThunk(88 'user/fetch',89 async (userId: string, { rejectWithValue }) => {90 try {91 const response = await api.getUser(userId)92 return response.data93 } catch (error) {94 return rejectWithValue(error.message)95 }96 }97)98```99100## Performance Optimization101102- Use React.memo() strategically103- Implement useCallback for memoized functions104- Apply useMemo for expensive computations105- Avoid inline function definitions in JSX106- Use dynamic imports for code splitting107- Employ proper keys in lists (avoid index-based keys)108109## Selectors110111- Create memoized selectors with createSelector112- Encapsulate state shape in selectors113- Compose selectors for derived data114- Avoid computing in components115116## Error Handling117118- Implement error boundaries with external logging119- Use Zod for validation120- Handle async errors in thunks121- Provide user-friendly error messages122123## Testing124125- Apply Jest and React Testing Library126- Follow Arrange-Act-Assert patterns127- Mock external dependencies128- Test reducers, selectors, and thunks independently129130---131> Converted and distributed by [TomeVault](https://tomevault.io/claim/mindrally) — claim your Tome and manage your conversions.132<!-- tomevault:4.0:skill_md:2026-04-11 -->