You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Router 6 useLoaderData返回缓存数据问题求助

React Router v6 useFetcher.submit 触发loader后useLoaderData返回旧数据问题

我在基于Vite的React 18项目中使用react-router-dom 6.22.3,通过useFetcher的fetcher.Form组件实现功能:在表单的change事件中调用fetcher.submit,这一操作能成功修改请求参数,且父路由的loader函数也会被重新调用,但路由内通过useLoaderData获取的数据传给子组件时,始终返回旧数据。

补充说明:索引路由的loader函数本身执行正常,能返回正确的userData,但在fetcher.submit调用后,组件内useLoaderData获取的数据依旧不正确。


路由创建代码

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');
    // 每次fetcher.submit()都会正确调用这里
    const userData = await getUserData(startDate, endDate);

    return { userData };
}

export default function Index() {
    // userData第一次会获取新数据,但之后又变回旧数据
    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;
        // 成功触发父路由loader,但useLoaderData仍返回旧数据
        fetcher.submit(
            { startDate, endDate }
        );
    };

    return (
        <fetcher.Form>
            <DateRangePicker
                onChange={handleDateRangeChange}
                moveRangeOnFirstSelection={false}
                ranges={state}
            />
        </fetcher.Form>
    );
}

内容的提问来源于stack exchange,提问作者Nosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:11:04