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

使用React的useNavigate时为何跳转到http://localhost:3000/?路由?

问题:useNavigate跳转失效,点击按钮仅刷新当前页面

我尝试用useNavigate实现页面跳转,启动站点后点击按钮,页面只会刷新当前页,URL从http://localhost:3000变为http://localhost:3000/?,并未跳转到/list页面。

相关代码

提交函数:

const submitForm = async (e) => {
  const res = await fetch("http://localhost:8000/properties")
  const jsonData = await res.json()
  setProperties(jsonData)
  navigate("/list", { state: properties })
}

按钮元素:

<button onClick={() => submitForm()}>Find Properties</button>

路由配置(App.js):

export default function App() {
  return (
    <BrowserRouter>
      <div className="App">
        <Routes>
          <Route exact path="/" element={<FormComponent />} />
          <Route path="/list" element={<ListComponent />} />
        </Routes>
      </div>
    </BrowserRouter>
  )
}

解决方案

1. 阻止表单默认提交行为

如果按钮嵌套在<form>标签内,浏览器会默认触发表单提交,导致页面刷新,直接覆盖navigate的跳转逻辑。两种解决方式:

  • 在submitForm函数开头添加e.preventDefault(),明确阻止默认行为
  • 给按钮添加type="button"属性,避免触发表单提交流程

2. 修正状态传递的异步问题

setProperties是异步更新函数,调用后无法立即拿到最新的properties值,直接传递会导致路由状态携带旧数据。应该直接使用请求返回的jsonData作为状态参数。

修改后的代码

提交函数:

const submitForm = async (e) => {
  // 阻止默认提交行为,避免页面刷新
  e.preventDefault();
  
  const res = await fetch("http://localhost:8000/properties");
  const jsonData = await res.json();
  setProperties(jsonData);
  // 直接传递请求返回的最新数据
  navigate("/list", { state: jsonData });
};

按钮元素(二选一):

// 方式一:保留默认类型,靠函数内阻止默认行为
<button onClick={(e) => submitForm(e)}>Find Properties</button>

// 方式二:设置按钮类型为button,避免触发表单提交
<button type="button" onClick={() => submitForm()}>Find Properties</button>

优化路由配置(React Router v6无需exact):

export default function App() {
  return (
    <BrowserRouter>
      <div className="App">
        <Routes>
          <Route path="/" element={<FormComponent />} />
          <Route path="/list" element={<ListComponent />} />
        </Routes>
      </div>
    </BrowserRouter>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:55:25