Sobes.tech
Middle

Il y a un filtre avec des onglets. Lors du changement rapide d'onglets, il arrive que d'anciennes valeurs s'affichent, ne correspondant pas à l'onglet actuel. Quelle en est la cause et comment y remédier?

sobes.tech IA

Réponse de l'IA

Причина появления старых значений при быстром переключении табов — это асинхронные запросы, которые возвращают данные не в том порядке, в котором были отправлены. Например, запрос для таба 1 пришёл позже, чем для таба 2, но обновляет состояние, перезаписывая данные.

Как исправить:

  • Отменять предыдущие запросы при переключении табов (если используется fetch API, можно применять AbortController).
  • Использовать уникальные идентификаторы запросов и обновлять состояние только если ответ соответствует текущему активному табу.
  • Применять локальное состояние для каждого таба, чтобы данные не перезаписывались.

Пример с AbortController:

let controller = null;

function fetchData(tabId) {
  if (controller) {
    controller.abort();
  }
  controller = new AbortController();
  fetch(`/data?tab=${tabId}`, { signal: controller.signal })
    .then(response => response.json())
    .then(data => {
      if (currentTab === tabId) {
        updateUI(data);
      }
    })
    .catch(err => {
      if (err.name !== 'AbortError') {
        console.error(err);
      }
    });
}

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