Подскажите пожалуйста, как изменение данных в Redux вызывают ререндер того компонента где эти данные используются?
Смотрел как устроена работа Redux в видео "https://youtu.be/sLCfWSle5Jw?si=8b2M6WBCMzdgp1cL", но там не рассказывают о том как вызывается ререндер компонента после изменения данных. 
Вот весь код из видео: 
const createStore = (reducer) => {
    let state = reducer(undefined, { type: '__INIT__' });
    let subscribers = [];
    return {
        getState: () => state,
        dispatch: action => { 
            state = reducer(state, action);
            subscribers.forEach(cb => cb());
        },
        subscribe: (cb) => subscribers.push(cb),
    };
};
const initialState = {
    count: 0,
};
const INCREMENT = 'INCREMENT';
const increment = count => ({
    type: INCREMENT,
    payload: count,
});
const countReducer = (state = initialState, action) => {
    switch (action.type) {
        case INCREMENT:
            return {
                ...state,
                count: state.count + action.payload,
            };
        
        case 'DECREMENT':
            return {
                ...state,
                count: state.count - action.payload,
            };
        default:
            return {
                ...state,
            };
    }
};
const initialUSerState = {
    users: [],
};
const userReducer = (state = initialUSerState, action) => {
    switch (action.type) {
        case 'SUCCESS':
            return {
                ...state,
                users: action.payload,
            };
        default:
            return {
                ...state,
            };
    }
};
// const reducer = (state, action) => {
//     return {
//         userState: userReducer(state.userState, action),
//         countState: countReducer(state.countState, action),
//     };
// };
const combineRedcuers = (reducersMap) => {
    return (state, action) => {
        const nextState = {};
        Object.entries(reducersMap).forEach(([key, reducer]) => {
            nextState[key] = reducer(state ? state[key] : state, action);
        });
        return nextState;
    };
};
const rootReducer = combineRedcuers({ userState: userReducer, countState: countReducer });
// const store = createStore(rootReducer);
// console.log(store.getState());
// // store.subscribe(() => console.log('change'));
// store.dispatch(increment(3));
// store.dispatch({ type: 'DECREMENT', payload: 1 });
// store.dispatch({ type: 'SUCCESS', payload: [{ name: 'user' }] });
// console.log(store.getState());
const logger = store => dispatch => action => {
    console.log(action.type);
}
const thunk = store => dispatch => action => {
    if (typeof action === 'function') {
        return action(store.dispatch, store.getState);
    }
    return dispatch(action);
};
const applyMiddleware = (middleware) => {
    return (createStore) => {
        return (reducer) => {
            const store = createStore(reducer);
            return {
                dispatch: action => middleware(store)(store.dispatch)(action),
                getState: store.getState,
            }
        }
    }
};
const init = {
    isLoading: false,
}
const reducerNew = (state = init, action) => {
    switch (action.type) {
        case 'STARTED':
            return {
                ...state,
                isLoading: true,
            };
        case 'SUCCESS':
            return {
                ...state,
                isLoading: false,
            };
        default:
            return {
                ...state,
            }
    }
}
const someAction = () => {
    return async (dispatch) => {
        dispatch({ type: 'STARTED' });
        await new Promise(resolve => setTimeout(() => resolve(), 2000));
        dispatch({ type: 'SUCCESS' });
    }
}
const createStoreWithMiddleware = applyMiddleware(logger)(createStore);
const storeWithMiddle = createStoreWithMiddleware(reducerNew);
console.log(storeWithMiddle.getState());
storeWithMiddle.dispatch({ type: 'SUCCESS' });
console.log(storeWithMiddle.getState());
setTimeout(() => {
    console.log(storeWithMiddle.getState());
}, 5000);