Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Creating new slice

Step 1:

...

1.) Create new folder

...

example: features/locationSlice)

...

2

...

.) Add boilerplate files

Add three files: api.js , index.js, and state.js.

...

3

...

.) Add initial state

Here, in the state.js, we are adding the initial state.

Code Block
export const initialState = {
  value: {
    location: {}
  etc: {},
};

...

4.) Add createSlice()

Create your slice in the index.js page.

Code Block
import { createSlice } from "@reduxjs/toolkit";

export const locationSlice = createSlice({
  name: "location",
  initialState,
  reducers: {
    addLocation: (state, action) => {
      state.value.push(action.payload);
    },
    deleteLocation: (state, action) => {
      state.value = state.value.filter((item) => item.id !== action.payload.id);
    },
  },
  extraReducers: {
  [getLocations.pending]: (state) => {
      state.loading = true;
    },
    [getLocations.fulfilled]: (state, { payload }) => {
      state.loading = false;
      state.etc = payload;
    },
    [getLocations.rejected]: (state) => {
      state.loading = false;
      state.error = true;
      state.errormessage = "";
    },
  },
});

...

5.) Create async thunk(for API logic)

Next, we are adding any API-related async thunks in the api.js page.

Code Block
import { createAsyncThunk } from "@reduxjs/toolkit";

export const getLocations = createAsyncThunk(
  "steps/getLocations",
  async ({ id }, thunkAPI) => {
    const res = await fetch(
      `https://locationsAPI.com/${id}`
    ).then((data) => data.json());
    return res;
  }
);

Afterwards, update the index.js page in the extraReducers section with getLocations[pending], getLocations[fulfilled], and getLocations[rejected] by importing the action, as well as updating the extraReducers.

Code Block
import { createSlice } from "@reduxjs/toolkit";
import { getLocations } from "./api";

export const locationSlice = createSlice({
  name: "location",
  initialState,
  reducers: {
    addLocation: (state, action) => {
      state.value.push(action.payload);
    },
    deleteLocation: (state, action) => {
      state.value = state.value.filter((item) => item.id !== action.payload.id);
    },
  },
  extraReducers: { <--
HERE   [getLocations.pending]: (state) => {
      state.loading = true;
    },
    [getLocations.fulfilled]: (state, { payload }) => {
      state.loading = false;
      state.etc = payload;
    },
    [getLocations.rejected]: (state) => {
      state.loading = false;
      state.error = true;
      state.errormessage = "";
    },
  },
});

Line 2 : Import the getLocations() action.

Line 15-27 : Update the index.js page in the extraReducers section with getLocations[pending], getLocations[fulfilled], and getLocations[rejected]

6.) Add the slice to Store

Code Block
import locationSlice from "./features/location/locationSlice";

export const store = configureStore({
  reducer: {
    filter: filterSlice,
    steps: stepSlice,
    location: locationSlice
  },
});