Я разрабатываю приложение с помощью React Query и React Table, но таблица, кажется, ломается, когда я меняю ключ запроса, что приводит к сбою веб-сайта.
Я открыл вопрос об их GH, но у меня до сих пор нет ответа, и мне очень нужна помощь.
Вот минимальное воспроизведение проблемы: codesanbox
Сбой происходит при рендеринге таблицы (точнее, функции table.getRowModel()
), а не при определении реальных столбцов или таблицы. Это также происходит только при ОБНОВЛЕНИИ ключей запроса, при первоначальном рендеринге все работает нормально.
Большое спасибо, Херби
Нет доступа... :(
Виноват. Забыл об этом. Попробуй это. codeandbox.io/p/sandbox/…
ммм да, странно... Я переместил фильтр в запрос, но простое запоминание исправляет это... Почему в этом случае нам нужно запоминать, несмотря на то, что мы просто возвращаем данные снова (см. здесь: codeandbox.io/ п/песочница/…)
спасибо, кстати, я подтвержу ваш вопрос, если вы его добавите 👍🏼
Проблемы с кодом
queryFn: внутренняя операция фильтра возврата queryFn была выполнена на основе successOrError
. В идеале отфильтрованные данные должны возвращаться из серверной части.
Всякий раз, когда компонент выполняет повторную отрисовку (например, когда обновляется значение SuccessOrError, что происходит именно в момент сбоя страницы), если данные присутствуют, операция фильтра запускается снова, что, в свою очередь, обновляет значение таблицы, и компонент снова выполняет повторную отрисовку. Вот так мы и застреваем в бесконечном цикле повторных рендерингов.
const table = useReactTable({
columns,
data: data
? data.filter((v) =>
successOrError === "success" ? v.status < 400 : v.status >= 400
)
: [],
getCoreRowModel: getCoreRowModel(),
});
РЕШЕНИЕ:
Теперь memoizedData изменяется только при изменении зависимостей, а memoziedData передается в таблицу, а таблица обновляется только при обновлении memoizedData.
// MEMOIZE DATA to avoid infinite rerenders.
const memoizedData = useMemo(() => {
if (!data) return [];
return data.filter((v) =>
successOrError === "success" ? v.status < 400 : v.status >= 400
);
}, [data, successOrError]);
Найдите «Обновление». добавил комментарий. codeandbox.io/p/sandbox/…