Редактировать: Просто чтобы прояснить, сама функция загрузчика работает правильно в индексном маршруте и возвращает правильные пользовательские данные. Однако данные, возвращаемые внутри компонента через useLoaderData, неверны после вызовов fetcher.submit.
В соответствии с просьбой ниже приведена ссылка на ссылку codeSandbox, которая демонстрирует проблему: Ссылка на CodeSandBox
Ниже показано создание маршрутизатора:
const router = createBrowserRouter([
{
path: '/',
element: <Root />,
errorElement: <ErrorPage />,
children: [
{ index: true, element: <Index />, loader: indexLoader },
],
}
]);
const rootElement = document.getElementById('root');
if (rootElement) {
ReactDOM.createRoot(rootElement).render(
<React.StrictMode>
<RouterProvider router = {router} />
</React.StrictMode>
);
} else {
console.error("Element with ID 'root' not found in the document");
}
затем индексный маршрут:
import RangePicker from '../components/rangePicker';
export async function loader({ request }) {
const url = new URL(request.url);
const startDate = url.searchParams.get('startDate');
const endDate = url.searchParams.get('endDate');
// This gets called correctly on every fetcher.submit();
const userData = await getUserData(startDate, endDate);
return { userData };
}
export default function Index() {
// userData if logged gets called once with new data, but
// after that gets called again with old data
const { userData } = useLoaderData();
return (
<>
<div>
<RangePicker />
</div>
<div>
<User data = {userData} />
</div>
</>
);
}
Ниже приведен компонент RangePicker:
import { addDays } from 'date-fns';
import { useState } from 'react';
import { DateRangePicker } from 'react-date-range';
import { useFetcher } from 'react-router-dom';
export default function RangePicker() {
const [state, setState] = useState([
{
startDate: new Date(),
endDate: addDays(new Date(), 7),
key: 'selection',
},
]);
const fetcher = useFetcher();
const handleDateRangeChange = (item) => {
setState([item.selection]);
const startDate = item.selection.startDate;
const endDate = item.selection.endDate;
//successfully triggers the loader for parent, but useLoaderData
// still returns previous data.
fetcher.submit(
{ startDate, endDate }
);
};
return (
<fetcher.Form>
<DateRangePicker
onChange = {handleDateRangeChange}
moveRangeOnFirstSelection = {false}
ranges = {state}
/>
</fetcher.Form>
);
}
Это правильно @DrewReese. Я могу добавить это туда.
Это очень интересно. Не могли бы вы создать работающую демо-версию Codesandbox, воспроизводящую такое поведение, которое мы могли бы проверить вживую?
@DrewReese, как и просили, я предоставил пример CodeSandbox, чтобы продемонстрировать проблему. Надеюсь, поможет.
Хук @Nosh useLoaderData
предоставляет последнее значение, возвращаемое вашей функцией загрузчика маршрута, и он не запускается, когда форма отправляется с помощью сборщика. См. этот выпуск на Github
Спасибо @Amit, я также разместил это на Github и получил подробный ответ. Короче говоря, запросы Get не вызывают повторную проверку, а запросы POST или мутации. Решение состоит в том, чтобы получить мутированные данные из средства выборки в маршруте родительского индекса и объединить их. Я опубликую ответ более подробно по этой проблеме на GitHub: github.com/remix-run/react-router/issues/11518
Поскольку я также разместил это как проблему на странице RR-github. Более развернутый ответ я получила там
Но ответ заключается в том, что запросы GET не запускают проверку в маршрутизаторе реакции v6; только POST или мутации.
export default function Index() {
// userData if logged gets called once with new data, but
// after that gets called again with old data
const { userData } = useLoaderData();
let fetcher = useFetcher();
let mostRecentData = fetcher.data || userData;
return (
<>
<div>
<RangePicker />
</div>
<div>
<User data = {mostRecentData} />
</div>
</>
);
}
Вы хотите сказать, что загрузчик индексного маршрута правильно извлекает правильное значение
userData
изgetUserData
, т. е. значениеuserData
— это то, что вы ожидаете после отправки и повторной проверки маршрута, но каким-то образом возвращает неправильное значениеuserData
обратно в компонент? Можете ли вы отредактировать, чтобы прояснить проблему и предоставить более четкие сведения об отладке?