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

React Router v7中fetcher提交数据触发整页刷新问题咨询

React Router v7 使用fetcher提交数据触发整页刷新问题

我在使用React Router v7开发时遇到一个问题:通过fetcher提交数据时会触发整页刷新。按照我的理解,fetcher应该只完成数据提交、重新加载路由数据并重新渲染组件,但实际流程是提交数据、获取新数据后触发了整页刷新,看起来fetcher最终并未阻止浏览器的默认表单提交行为。


相关代码

路由组件(对应/test-fetcher路由)

// 对应路由 "test-fetcher" 的组件
import { initialData, saveData } from 'data/data-server'; // 仅用于在服务端读写JSON文件
import type { Route } from './+types/test-fetcher';
import SideBar from '~/components/SideBar';
import BasicDisplay from '~/components/BasicDisplay';

export async function loader({ params }: Route.LoaderArgs) {
    return initialData();
}

export async function action({ params, request }: Route.LoaderArgs) {
    const data = await request.formData();

    await saveData(data.get('label'));

    return Response.json({ ok: true });
}

export default function TestFetcher({
    loaderData,
}: Route.ComponentProps) {
    const { elts } = loaderData;

    return (
        <div>
            <BasicDisplay elts={elts} />
            <SideBar />
        </div>
    );
}

SideBar组件(使用useFetcher钩子)

import { useState } from 'react';
import { useFetcher } from 'react-router';

export default function SideBar() {
    const [inputValue, setInputValue] = useState('post me please');
    const fetcher = useFetcher();
    const onInputChange = (evt) => {
        setInputValue(evt.currentTarget.value);
    };

    return (
        <aside className="w-2/5">
            <fetcher.Form
                method="post"
                action="/test-fetcher"
                className="my-10 px-4"
            >
                <input
                    type="text"
                    value={inputValue}
                    onChange={onInputChange}
                    name="label"
                />
                <button type="submit">Submit</button>
            </fetcher.Form>
        </aside>
    );
}

BasicDisplay组件

const BasicDisplay = ({ elts }) => {
    return (
        <ul>
            {elts.map((e) => (
                <li key={e.id}>{e.label}</li>
            ))}
        </ul>
    );
};

export default BasicDisplay;

package.json 依赖配置

{
    [...]
    "private": true,
    "type": "module",
    "scripts": {
        "build": "react-router build",
        "dev": "react-router dev",
        "start": "react-router-serve ./build/server/index.js",
        "typecheck": "react-router typegen && tsc"
    },
    "dependencies": {
        "@dagrejs/dagre": "^1.1.4",
        "@hookform/resolvers": "^4.1.2",
        "@radix-ui/react-label": "^2.1.2",
        "@radix-ui/react-slot": "^1.1.2",
        "@react-router/node": "^7.1.5",
        "@react-router/serve": "^7.1.5",
        "@xyflow/react": "^12.4.2",
        "class-variance-authority": "^0.7.1",
        "clsx": "^2.1.1",
        "isbot": "^5.1.17",
        "lucide-react": "^0.474.0",
        "openai": "^4.85.2",
        "react": "^19.0.0",
        "react-dom": "^19.0.0",
        "react-hook-form": "^7.54.2",
        "react-router": "^7.1.5",
        "tailwind-merge": "^3.0.1",
        "tailwindcss-animate": "^1.0.7",
        "zod": "^3.24.2",
        "zustand": "^5.0.3"
    },
    "devDependencies": {
        "@react-router/dev": "^7.1.5",
        "@tailwindcss/vite": "^4.0.0",
        "@types/node": "^20",
        "@types/react": "^19.0.1",
        "@types/react-dom": "^19.0.1",
        "autoprefixer": "^10.4.20",
        "react-router-devtools": "^1.0.0",
        "tailwindcss": "^4.0.4",
        "typescript": "^5.7.2",
        "vite": "^5.4.11",
        "vite-tsconfig-paths": "^5.1.4"
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:05:00