Задать вопрос
ReturnMeVoid
@ReturnMeVoid

Как в react-router-dom сделать чтобы loader не блокировал рендер страницы?

В данном роутере можно назначить loader для роута - функция для фетча данных до загрузки компонента.

По умолчанию исполнение loader'a блокирует рендер компонента, пока он не получит ответ от сервера. Можно ли как-нибудь отключить блокирование рендера и дождаться прихода данных уже в загруженном компоненте?

P.S. Это критично, т.к. использую lazy загрузку в роутере.
  • Вопрос задан
  • 89 просмотров
Подписаться 1 Сложный 2 комментария
Решения вопроса 1
Aetae
@Aetae
Тлен
Сам не пользовался, но по докам вроде никаких магических параметров не вижу.

Вот тебе тогда вспомогательные функции которые сделают то, что тебе надо:
import { json, useLoaderData } from "react-router-dom";
import { useEffect } from "react";

export function eagerLoader(loader) {
  return (...args) => {
    const promise = loader(...args)
      .then(res => res instanceof Response ? res.json() : res );
    return json({ promise }, { status: 200 });
  }
}

export function useEagerLoaderData(defaultData) {
  const [data, setData] = useState(defaultData);
  const promise = useLoaderData()?.promise;

  useEffect(() => {
    promise?.then(setData);
  }, [promise]);

  return data;
}
let route = {
  path: "...",
  loader: eagerLoader(({ request }) => ...),
  lazy: () => import("./Comp"),
};

const Comp = () => {
  const data = useEagerLoaderData([]);

  //...
}

Код не проверял, но думаю логика очевидна.:)

P.S. defaultData мб стоит вынести в обёртку eagerLoader, хз, тут сам смотри свои юзкейсы.:)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы