State Management

Redux is a predictable state container for JavaScript apps.

It helps you write applications that behave consistently, run in different environments (client, server, and native), and are easy to test. On top of that, it provides a great developer experience



Creating a new slice

Create new slice inside src/redux/slices/product

import { createSlice } from '@reduxjs/toolkit';
 
const initialState = {
  products: [],
};
 
const slice = createSlice({
  name: 'product',
  initialState,
  reducers: {
    getProductsSuccess(state, action) {
      state.isLoading = false;
      state.products = action.payload;
    },
  },
});
 
export default slice.reducer;
 
export function getProducts() {
  return async (dispatch) => {
    dispatch(slice.actions.startLoading());
    try {
      const response = await axios.get('/api/products');
      dispatch(slice.actions.getProductsSuccess(response.data.products));
    } catch (error) {
      dispatch(slice.actions.hasError(error));
    }
  };
}

Import slice

  • import slice inside `src/redux/rootReducer

    `

import { combineReducers } from 'redux';
import productReducer from './slices/product';
 
const rootReducer = combineReducers({
  product: productReducer,
});
 
export { rootReducer };

If you want to use Redux with localStorage

import { combineReducers } from 'redux';
import { persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage';
import productReducer from './slices/product';
 
const rootPersistConfig = {
  key: 'root',
  storage: storage,
  keyPrefix: 'redux-',
  version: 1,
  whitelist: ['products'],
};
 
const rootReducer = combineReducers({
  product: productReducer,
});
 
export { rootReducer };

Usage

import { useDispatch, useSelector } from 'react-redux';
import { getProducts } from 'src/redux/slices/product';
 
function ProductList() {
  const dispatch = useDispatch();
 
  const { products } = useSelector((state) => state.product);
 
  useEffect(() => {
    dispatch(getProducts());
  }, [dispatch]);
 
  return (
    <div>
      {products.map((product) => (
        <div key={product.id}>
          <div>{product.name}</div>
          <div>{product.price}</div>
          <img src={product.img} alt={product.name} />
        </div>
      ))}
    </div>
  );
}