https://reactjs.org/docs/hooks-effect.html
"Если вы передадите пустой массив ([]), реквизиты и состояние внутри эффекта всегда будут иметь свои начальные значения. При передаче [] в качестве Второй аргумент ближе к знакомой ментальной модели componentDidMount и componentWillUnmount, обычно есть лучшие решения, позволяющие избежать повторного запуска эффектов слишком часто.Кроме того, не забывайте, что React откладывает запуск useEffect до того, как браузер нарисовал, поэтому выполнение дополнительной работы меньше проблем. "
2-й аргумент - это то, что заставляет ваш компонент перерисовываться, устанавливая это в вашей переменной состояния userCollection, запускает ваш useEffect при каждом обновлении состояния - вызывая бесконечное l oop, потому что your useEffect обновляет состояние.
Что вы хотите на самом деле запустить рендеринг? Если сначала он должен быть пустым, а затем запускаться только один раз для загрузки изображений, вы можете изменить его на что-то вроде этого:
useEffect(() => {
if(!userCollection){
getUserCollection(userAuth.uid)
.then((response) => {
if (response) setUserCollection(response);
})
.catch((error) => console.log(error));
}
}, [userCollection]);
С этим логом c, useEffect обновит только состояние, когда оно пустое. Если вы ожидаете непрерывных повторных визуализаций, вам следует создать переменную, которая будет обновляться, когда повторные визуализации должны происходить.