Redux - RTK Query (Mocked Base)

RTK Query simplifies data fetching and caching. Below, we use a mocked baseQuery to avoid external network calls while demonstrating the data flow.

Try it: Mocked query

View source
const { configureStore } = RTK;
const { createApi } = RTK;
// Mock baseQuery: waits and returns data
const mockBaseQuery = async (args) => {
  await new Promise(r => setTimeout(r, 400));
  return { data: { id: 1, title: 'Hello from RTK Query (mock)' } };
};
const api = createApi({
  reducerPath: 'api',
  baseQuery: mockBaseQuery,
  endpoints: (builder) => ({
    getGreeting: builder.query({ query: () => ({}) })
  })
});
const store = configureStore({ reducer: { [api.reducerPath]: api.reducer }, middleware: gDM => gDM().concat(api.middleware) });
function App(){
  const { Provider, useDispatch, useSelector } = ReactRedux;
  const selectGreeting = api.endpoints.getGreeting.select();
  function Panel(){
    const dispatch = useDispatch();
    const state = useSelector(selectGreeting);
    const status = state?.status || 'uninitialized';
    return (
      <div>
        <button onClick={() => dispatch(api.endpoints.getGreeting.initiate())} disabled={status==='pending'}>Fetch</button>
        <div style={{marginTop:8}}>Status: {status}</div>
        {state?.data && <div>Data: {state.data.title}</div>}
        {state?.error && <div style={{color:'salmon'}}>Error</div>}
      </div>
    );
  }
  return <Provider store={store}><Panel /></Provider>;
}
ReactDOM.createRoot(document.getElementById('rtkq-root')).render(<App />);

Syntax primer

  • createApi({ reducerPath, baseQuery, endpoints }) defines endpoints and generates actions/selectors.
  • api.endpoints.X.initiate() dispatches a request; api.endpoints.X.select() returns a selector for derived state.