Ваш эффект запускается на основе реквизита "shopUsers", который сам запускает действие с избыточностью, которое обновляет реквизит "shopUsers" и поэтому он продолжает бесконечно срабатывать.
Я думаю, что вы хотите оптимизировать эторендеринг самого компонента, поскольку вы уже используете redux, я предполагаю, что ваши реквизиты / состояния неизменны, поэтому вы можете использовать React.memo
для повторного рендеринга вашего компонента только при изменении одного из его реквизитов.
Также вы должны определить переменную состояния / props вне ваших ловушек, так как они используются в области действия всей функции следующим образом.
В вашем случае, если вы передаете пустой массив как второйparam to memo, то он будет срабатывать только на ComponentDidMount, если вы передадите null / undefined или ничего не передадите, он сработает на ComponentDidMount + ComponentDidUpdate, если вы хотите оптимизировать его так, что даже при изменении реквизита / обновлении компонента хук не выполняетне срабатывает, если не изменяется конкретная переменная, тогда вы можете добавить некоторую переменную в качестве второго аргумента
React.memo(function(props){
const [isLoading, setLoading] = useState(false);
const { getStoreUsers, shopUsers } = props;
useEffect(() => {
setLoading(true);
getStoreUsers().then(() => {
setLoading(false);
}).catch((err) => {
setLoading(false);
});
}, []);
...
})