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
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 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 };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>
);
}