UseEffect продолжает рендерить обходной путь

У меня есть небольшая проблема. Я хочу вызывать 4 API, когда компонент начинает рендеринг, поэтому я использовал для этого эффект использования, поэтому я зацикливаю свой массив, который имеет 4 элемента, и в каждом элементе я вызываю API, и каждый API сохраняет результат в селекторе с именем filtersCount. Проблема в том, что когда filterCount обновил цикл, он начинается заново. Как я могу предотвратить это, не отключая eslint??

const fetchCounts = useCallback(
  (item) => {
    if (!filtersCount[item.key]) {
      dispatch(getFilterCount({ filters: item.countFilters, key: item.key }));
    }
  },
  [dispatch, filtersCount]
);

useEffect(() => {
  exploreItemTypes.map((item) => {
    fetchCounts(item);
  });
}, [exploreItemTypes, fetchCounts]);
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

вы можете использовать Ref для этого:

const firstRender =useRef(false)
useEffect(() => {
    if (firstRender.current == false){
      exploreItemTypes.map((item) => {
        fetchCounts(item);
       });
      firstRender.current = true 
    }

  }, [exploreItemTypes, fetchCounts]);

Это сработало, но как вы думаете, практично ли это?

warCommander 15.05.2022 13:11

да, мы использовали это в профессиональных проектах, вы, вероятно, можете добиться того же результата, используя переменную, объявленную вне класса.

سعيد 15.05.2022 14:13

Я думаю, что самый простой способ - использовать пустой массив в вашем useEffect.

useEffect(() => {
    exploreItemTypes.map((item) => {
      fetchCounts(item);
    });
  }, []);

это остановится, как только ваша итерация закончится.

не могу поверить, что я не подумал об этом, да, это также должно быть приемлемым решением, я бы все равно добавил fetchCounts в массив зависимостей.

سعيد 16.05.2022 14:20

но это даст ошибки в eslint, в этом случае fetchCount должен быть обратным вызовом и будет принимать зависимости в массиве. Итак, это то же самое

warCommander 17.05.2022 06:58

Другие вопросы по теме