Optimizing Selector Performance with Memoization

Show a scenario where a selector with expensive computations is optimized using createSelector’s memoization feature, to prevent unnecessary recalculations on state change.
import { createSelector } from '@reduxjs/toolkit';

// Assume a complex state shape
const selectExpensiveData = state => state.expensiveData;

// A hypothetical expensive computation
const computeExpensiveValue = (data) => {
    console.log('Expensive computation running');
    // ... some CPU-intensive operations ...
    return data.reduce((total, item) => total + item.complexCalculation, 0);

// Memoized selector using createSelector
export const selectTotalExpensiveValue = createSelector(
    (expensiveData) => computeExpensiveValue(expensiveData)
This code defines a memoized selector using createSelector from Redux Toolkit. The computeExpensiveValue performs expensive calculations on the data. createSelector is used to ensure that these calculations are only re-evaluated when selectExpensiveData returns a different value.