Search code examples
javascriptreactjsreduxredux-toolkitrtk-query

How to configure index.js with ApiProvider in RTK


ChatGPT suggests the following to configure the index.js at the root directory. I am not quite sure it is the most widely used practice. I want to ask your feedback.

    // index.js
    import React from 'react';
    import ReactDOM from 'react-dom';
    import { Provider } from 'react-redux';
    import { ApiProvider } from '@reduxjs/toolkit/query/react';
    import { api } from './api'; // Import your RTK Query API object
    import store from './store'; // Import your Redux store
    import App from './App'; // Import your main component
    
    ReactDOM.render(
      <Provider store={store}>
        <ApiProvider api={api}>
          <React.StrictMode>
            <App />
          </React.StrictMode>
        </ApiProvider>
      </Pro

vider>,
  document.getElementById('root')
);

Solution

  • The ApiProvider is supposed to be used when your React app is not already using Redux.

    🔥 Danger

    Using this together with an existing Redux store will cause them to conflict with each other. If you are already using Redux, please follow the instructions as shown in the Getting Started guide.

    It's basically a light wrapper around a store instance that allows non-Redux-based React apps to use and leverage Redux-Toolkit Query for data wrangling.

    Since you are using Redux already, as clearly indicated by the react-redux Provider component and store, your API slices should just be directly integrated in the store.

    Basic example (see Configuring the store):

    import { configureStore } from '@reduxjs/toolkit';
    // Or from '@reduxjs/toolkit/query/react';
    import { setupListeners } from '@reduxjs/toolkit/query';
    import { api } from './api';
    ... import state slice reducers ...
    
    export const store = configureStore({
      reducer: {
        ... all the other slice reducers ...
    
        // Add the generated reducer as a specific top-level slice
        [api.reducerPath]: pokemonApi.reducer,
      },
      // Adding the api middleware enables caching, invalidation, polling,
      // and other useful features of `rtk-query`.
      middleware: (getDefaultMiddleware) =>
        getDefaultMiddleware().concat(api.middleware),
    });
    
    // optional, but required for refetchOnFocus/refetchOnReconnect behaviors
    // see `setupListeners` docs - takes an optional callback as the 2nd arg for customization
    setupListeners(store.dispatch);
    
    // index.js
    import React from 'react';
    import ReactDOM from 'react-dom';
    import { Provider } from 'react-redux';
    import store from './store';
    import App from './App';
    
    ReactDOM.render(
      <React.StrictMode>
        <Provider store={store}>
          <App />
        </Provider>
      </React.StrictMode>,
      document.getElementById('root')
    );