<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TechEase</title>
    <description>The latest articles on DEV Community by TechEase (@techease_917692466388d6e7).</description>
    <link>https://dev.to/techease_917692466388d6e7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3648897%2F648a3caf-f1fd-4756-a614-cf2ca4fdf78e.png</url>
      <title>DEV Community: TechEase</title>
      <link>https://dev.to/techease_917692466388d6e7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/techease_917692466388d6e7"/>
    <language>en</language>
    <item>
      <title>React + Redux Toolkit + Axios</title>
      <dc:creator>TechEase</dc:creator>
      <pubDate>Sat, 06 Dec 2025 07:40:17 +0000</pubDate>
      <link>https://dev.to/techease_917692466388d6e7/react-redux-toolkit-axios-46db</link>
      <guid>https://dev.to/techease_917692466388d6e7/react-redux-toolkit-axios-46db</guid>
      <description>&lt;p&gt;🚀 A Modern React + Redux Toolkit + Axios Setup (Step-by-Step Guide)&lt;/p&gt;

&lt;p&gt;Working with APIs in React becomes much easier when you combine Redux Toolkit + Axios with a clean, scalable folder structure.&lt;/p&gt;

&lt;p&gt;This guide shows a production-style architecture that you can use in any real-world React project.&lt;/p&gt;

&lt;p&gt;📂 Folder Structure&lt;br&gt;
src/&lt;br&gt;
│&lt;br&gt;
├── api/&lt;br&gt;
│ ├── api.js # axios instance (reusable)&lt;br&gt;
│ └── endpoints.js # all API functions&lt;br&gt;
│&lt;br&gt;
├── app/&lt;br&gt;
│ └── store.js # Redux store setup&lt;br&gt;
│&lt;br&gt;
├── features/&lt;br&gt;
│ └── userSlice.js # Slice + async thunks&lt;br&gt;
│&lt;br&gt;
├── App.jsx&lt;br&gt;
└── main.jsx&lt;/p&gt;

&lt;p&gt;This structure keeps your API logic clean and helps scale your app easily.&lt;/p&gt;

&lt;p&gt;*🛠️ 1. Reusable Axios Instance (api.js)&lt;br&gt;
*&lt;/p&gt;

&lt;p&gt;import axios from "axios";&lt;/p&gt;

&lt;p&gt;const api = axios.create({&lt;br&gt;
  baseURL: "&lt;a href="http://localhost:5000/api" rel="noopener noreferrer"&gt;http://localhost:5000/api&lt;/a&gt;",&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// Attach token automatically&lt;br&gt;
api.interceptors.request.use((config) =&amp;gt; {&lt;br&gt;
  const token = localStorage.getItem("token");&lt;br&gt;
  if (token) {&lt;br&gt;
    config.headers.Authorization = &lt;code&gt;Bearer ${token}&lt;/code&gt;;&lt;br&gt;
  }&lt;br&gt;
  return config;&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;// Global error handler&lt;br&gt;
api.interceptors.response.use(&lt;br&gt;
  (res) =&amp;gt; res,&lt;br&gt;
  (err) =&amp;gt; {&lt;br&gt;
    console.error("API Error:", err.response?.data || err.message);&lt;br&gt;
    return Promise.reject(err);&lt;br&gt;
  }&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;export default api;&lt;/p&gt;

&lt;p&gt;The benefits:&lt;br&gt;
One place to manage API configuration&lt;br&gt;
Auto token support&lt;/p&gt;

&lt;p&gt;Clean, reusable API calls&lt;br&gt;
**&lt;br&gt;
📡 2. API Endpoints (endpoints.js)**&lt;/p&gt;

&lt;p&gt;import api from "./api";&lt;/p&gt;

&lt;p&gt;// GET /users&lt;br&gt;
export const fetchAllUsers = () =&amp;gt; api.get("/users");&lt;/p&gt;

&lt;p&gt;// Examples:&lt;br&gt;
// export const loginUser = (data) =&amp;gt; api.post("/auth/login", data);&lt;br&gt;
// export const createUser = (data) =&amp;gt; api.post("/users", data);&lt;/p&gt;

&lt;p&gt;This file keeps all API methods clean and organized.&lt;/p&gt;

&lt;p&gt;⚙️ 3. Redux Slice + AsyncThunk (userSlice.js)&lt;/p&gt;

&lt;p&gt;import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";&lt;br&gt;
import { fetchAllUsers } from "../api/endpoints";&lt;/p&gt;

&lt;p&gt;export const getUsers = createAsyncThunk("user/getUsers", async () =&amp;gt; {&lt;br&gt;
  const res = await fetchAllUsers();&lt;br&gt;
  return res.data;&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;const userSlice = createSlice({&lt;br&gt;
  name: "user",&lt;br&gt;
  initialState: {&lt;br&gt;
    users: [],&lt;br&gt;
    loading: false,&lt;br&gt;
    error: null,&lt;br&gt;
  },&lt;br&gt;
  extraReducers: (builder) =&amp;gt; {&lt;br&gt;
    builder&lt;br&gt;
      .addCase(getUsers.pending, (state) =&amp;gt; {&lt;br&gt;
        state.loading = true;&lt;br&gt;
        state.error = null;&lt;br&gt;
      })&lt;br&gt;
      .addCase(getUsers.fulfilled, (state, action) =&amp;gt; {&lt;br&gt;
        state.loading = false;&lt;br&gt;
        state.users = action.payload;&lt;br&gt;
      })&lt;br&gt;
      .addCase(getUsers.rejected, (state, action) =&amp;gt; {&lt;br&gt;
        state.loading = false;&lt;br&gt;
        state.error = action.error.message;&lt;br&gt;
      });&lt;br&gt;
  },&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;export default userSlice.reducer;&lt;/p&gt;

&lt;p&gt;This handles:&lt;br&gt;
Loading state&lt;br&gt;
Error state&lt;/p&gt;

&lt;p&gt;Updating Redux store with API data&lt;/p&gt;

&lt;p&gt;🗄️ 4. Configure the Store (store.js)&lt;/p&gt;

&lt;p&gt;import { configureStore } from "@reduxjs/toolkit";&lt;br&gt;
import userReducer from "../features/userSlice";&lt;/p&gt;

&lt;p&gt;export const store = configureStore({&lt;br&gt;
  reducer: {&lt;br&gt;
    user: userReducer,&lt;br&gt;
  },&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;🔌 5. Provider Setup (main.jsx)&lt;br&gt;
import React from "react";&lt;br&gt;
import ReactDOM from "react-dom/client";&lt;br&gt;
import { Provider } from "react-redux";&lt;br&gt;
import { store } from "./app/store";&lt;br&gt;
import App from "./App";&lt;/p&gt;

&lt;p&gt;ReactDOM.createRoot(document.getElementById("root")).render(&lt;br&gt;
  &lt;br&gt;
    &lt;br&gt;
  &lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;🎨** 6. Using the API Data in React (App.jsx)**&lt;br&gt;
import { useEffect } from "react";&lt;br&gt;
import { useDispatch, useSelector } from "react-redux";&lt;br&gt;
import { getUsers } from "./features/userSlice";&lt;/p&gt;

&lt;p&gt;function App() {&lt;br&gt;
  const dispatch = useDispatch();&lt;br&gt;
  const { users, loading, error } = useSelector((state) =&amp;gt; state.user);&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    dispatch(getUsers());&lt;br&gt;
  }, [dispatch]);&lt;/p&gt;

&lt;p&gt;if (loading) return &lt;/p&gt;
&lt;p&gt;Loading...&lt;/p&gt;;&lt;br&gt;
  if (error) return &lt;p&gt;Error: {error}&lt;/p&gt;;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      &lt;h2&gt;Users List&lt;/h2&gt;
&lt;br&gt;
      {users.map((u) =&amp;gt; (&lt;br&gt;
        &lt;p&gt;{u.name}&lt;/p&gt;
&lt;br&gt;
      ))}&lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}

&lt;p&gt;export default App;&lt;/p&gt;

&lt;p&gt;🎯 Final Thoughts&lt;/p&gt;

&lt;p&gt;With this setup you get:&lt;br&gt;
🔥 Clean architecture&lt;br&gt;
🔁Reusable API code&lt;br&gt;
⚡ Fast development with Redux Toolkit&lt;br&gt;
🧩 Scalable project structure&lt;/p&gt;

</description>
      <category>react</category>
      <category>redux</category>
      <category>javascript</category>
      <category>reduxtoolkit</category>
    </item>
  </channel>
</rss>
