Redux Toolkit

Created
TypeLibrary
LanguageJavascript
Last Edit

Installation

npm install @reduxjs/toolkit react-redux

Redux Store Setup

Define Store
import { combineReducers, configureStore } from "@reduxjs/toolkit";
import { setupListeners } from "@reduxjs/toolkit/query/react";

const reducers = combineReducers({});

const store = configureStore({
  reducer: reducers,
});

setupListeners(store.dispatch);
export default store;
Provide Store
import { Provider as StateProvider } from "react-redux";
import store from "@store/store";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <StateProvider store={store}>
      <App />
    </StateProvider>
  </React.StrictMode>
);

Usage

Create Slice
import { createSlice } from '@reduxjs/toolkit'

const initialState = {
  value: 0,
}

export const counterSlice = createSlice({
  name: 'counter',
  initialState,
  reducers: {
    increment: (state) => {
      state.value += 1
    },
    decrement: (state) => {
      state.value -= 1
    },
    incrementByAmount: (state, action) => {
      state.value += action.payload
    },
  },
})

export const { increment, decrement, incrementByAmount } = counterSlice.actions
export default counterSlice.reducer
Add Reducer to Store
import { configureStore } from '@reduxjs/toolkit'
import counterReducer from '../features/counter/counterSlice'

const reducers = combineReducers({
	counter: counterReducer,
});

export const store = configureStore({
  reducer: reducers
})
Use In Components
import React from 'react'
import { useSelector, useDispatch } from 'react-redux'
import { decrement, increment } from './counterSlice'

export function Counter() {
  const count = useSelector((state) => state.counter.value)
  const dispatch = useDispatch()

  return (
    <div>
      <div>
        <button
          aria-label="Increment value"
          onClick={() => dispatch(increment())}
        >
          Increment
        </button>
        <span>{count}</span>
        <button
          aria-label="Decrement value"
          onClick={() => dispatch(decrement())}
        >
          Decrement
        </button>
      </div>
    </div>
  )
}

Redux ToolKit Query

Define
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";

export const rtkAPI = createApi({
  reducerPath: "rtkAPI",
  baseQuery: fetchBaseQuery({ baseUrl: "/" }),
  endpoints: () => ({}),
});
Add Endpoints
These endpoints can be added in rtkAPI itself, here code splitting is used for maintainability.
import { rtkAPI } from "./emptySplitApi";

const coursesAPI = rtkAPI.injectEndpoints({
  endpoints: (builder) => ({
    getAllCourses: builder.query({
      query: (name) => `courses/${name}`,
    }),
    getCourseByID: builder.query({
      query: (id) => `courses/${id}`,
    }),
  }),
  overrideExisting: false,
});

export const { getAllCoursesQuery, getCourseByIDQuery } = coursesAPI;