Форум программистов, компьютерный форум, киберфорум
React/ReactJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 18.06.2020
Сообщений: 41

Компонент с запросом данных по интервалу не выполняет запрос при первом рендере

27.03.2025, 15:40. Показов 1348. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, господа!
ОПИСАНИЕ ПРОБЛЕМЫ: У меня есть простой компонент с запросом данных по интервалу в useEffect без зависимостей.
Идея в том, что при первом рендере устанавливается интервал, по которому будут происходить остальные запросы.
И эти запросы происходят, Но первый запрос происходит лишь по истечении времени интервала.
ОЖИДАЕМОЕ ПОВЕДЕНИЕ: А у меня есть необходимость получать данные при первом рендере и далее раз в интервал.
Код компонента:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
export default function PBCreator() {
    const pBName = 'Name'
    const dispatch = useDispatch()
    const intervalValue = useSelector(state => state.intervalValue.intervalValue) //кол-во миллисекунд берется из редакс-стейта    
 
    const getPBData = async () => {
            return await axios.get(
                 pBSrc,
                { headers: { 'Content-Type': 'application/json' } }
            ).then((res) => res.data.data)
        }
    
        const repeatFunction = async () => await getPBData().then((res) => dispatch(setPB(res))) //setPB пишет в редакс-стейт данные
 
    useEffect(() => {
        const interval = setInterval(repeatFunction, intervalValue)
        return () => clearInterval(interval)
    })
 
    return <LayersControlOverlay
                overlayName={pBName}
                overlayChecked={true}
                overlayContent={<FeatureGroupHOC grComponent={<PB />} grName={pBName} />}
            />
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.03.2025, 15:40
Ответы с готовыми решениями:

React компонент без рендера и получение содержимого контейнера
class UserManager extends React.Component { constructor(props) { super(props); this.state = { ...

Не рендерится компонент
Я имею следующий код: import './Form.css' import React, { Component } from 'react' import axios from 'axios' import Comment from...

Изменяю state но компонент не рендерится!
Приветствую Знатоки! При изменении массива не рендерится компонент &lt;TaskPanel /&gt;, сильно не пинайте я только вливарекчусь :) file...

4
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3834 / 1678 / 431
Регистрация: 14.03.2022
Сообщений: 4,235
27.03.2025, 17:04
Цитата Сообщение от WhiteRing Посмотреть сообщение
у меня есть необходимость получать данные при первом рендере и далее раз в интервал
Предложу такой вариант...

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import React, { useEffect} from 'react';
 
const intervalValue = 1000
// Эмулятор запроса данных
const getData = _ => new Promise(res => setTimeout(res, 1000))
 
// Главный компонент приложения
const App = () => {
  let t
  useEffect(function loop() {
    getData()
      .then(_ => {
        console.log('Данные получены...')
        t = setTimeout(loop, intervalValue)
      })
      .catch(console.log)
    return _ => clearTimeout(t)
  })
  return (
    <div className="app">
      Тестирование запросов...
    </div>
  );
};
 
export default App
0
Молодой техлид)
Эксперт JSЭксперт HTML/CSS
 Аватар для mr_dramm
1818 / 1056 / 329
Регистрация: 17.07.2021
Сообщений: 2,147
Записей в блоге: 14
28.03.2025, 18:28
Привет krvsa, =)
Я написал небольшую демку на твой вариант

Две серьезные проблемы:
- t будет undefined внутри первого вызова useEffect потому что актуальные значения переменных useEffect получает только через зависимости и только потом будет ей присвоено значение внутри then и при следующем рендере, что приведет к отмене только части таймаутов.
- useEffect не имеет зависимостей что приводит к запуску на каждый рендер и если выводить в этом же компоненте state который меняем в useEffect то будет бесконечных циклов для неомененных setTimeout что приводит к непредсказуемому и учащаемуся изменению состояния потому что setTimeout будут множиться с каждой перерисовкой


Исправленный код

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import React from 'react';
 
const fetchData = () =>
  new Promise((resolve) => {
    resolve(true);
  });
 
export default () => {
  const [state, setState] = React.useState(0);
  React.useEffect(() => {
    let ignore = false;
    fetchData().then((res) => {
      if (!ignore) {
        console.log('render', state);
        setTimeout(() => {
          setState(state + 1);
        }, 1000);
      }
    });
    return () => {
      ignore = true;
    };
  }, [state]);
 
  return <div>Тестирование запросов...{state}</div>;
};
Работает все очень просто когда меняется state запускается новый запрос.
ignoge тут нужен для того чтобы отменять повторные запросы в режиме отладки с включенным StrictMode React 18<
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3834 / 1678 / 431
Регистрация: 14.03.2022
Сообщений: 4,235
29.03.2025, 17:19
mr_dramm, привет и тебе...
Мой пример всего лишь макет. Его цель - показать как делать запуск и повтор без setInterval.
Он и работает только так, как он написан.

А вот то, что ты сделал пример еще и со стейтом - это молодец.
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
10.05.2025, 12:18
тут ведь типичное поведение интервала, собственно и решение должно быть как это обычно решается..
А обычно это решается тем, что перед вызовом setInterval вызывается сама функция
Я думаю вот такое должно решить проблему:
JavaScript
1
2
3
4
5
useEffect(() => {
        repeatFunction();
        const interval = setInterval(repeatFunction, intervalValue)
        return () => clearInterval(interval)
}, [repeatFunction, intervalValue])
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.05.2025, 12:18
Помогаю со студенческими работами здесь

HashRouter не рендерит мой компонент (
ReactDOM.render(&lt; Provider store={store}&gt; &lt;HashRouter&gt; &lt;Routes&gt; &lt;Route path={'/'}...

Route из react-router-dom 6 не рендерит компонент!
path совпадает абсолютно точно. я даже бывает пишу path={location.pathname},а он всё равно не рендерится ! рендерится только если напишу...

Реакт не рендерит компонент
Подключилa реакт к проекту на js. Ошибок нет, но компонент не рендерится. index.js: import {App} from &quot;./App.jsx&quot;; import...

Проблема с UseEffect. Выполняется несколько раз при рендеринги странице
Здравствуйте, недавно начал разбираться с React и столкнулся с такой проблемой, что при использовании useEffect страница отрендеривается 2...

Как сделать чтобы функция вызывалась только после первого рендеринга?
Здравствуйте, подскажите как сделать чтобы функция extraFunc вызывалась только после первого рендеринга(функция не должна срабатывать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru