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

react-router-dom页面导航问题:提交成功后跳转报错

问题:React表单提交成功后使用react-router-dom导航出错

我正在实现提交流程成功(布尔标志submitted变为true)后跳转到确认页的功能,但使用react-router-dom库的导航方法时遇到错误。

相关代码

import React, { useState } from 'react';
import axios from 'axios';
import { auth } from './firebase';
import { Link, Routes, Route, Navigate } from 'react-router-dom';
import './mainpage.css';
import './Confirmation';

const Mainpage = () => {
  const apiKey = '******';
  const baseId = '***********';
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    phoneNumber: '',
  });

  const [submitted, setSubmitted] = useState(false);

  const handleChange = (e) => {
    const { name, value } = e.target;
    setFormData({
      ...formData,
      [name]: value,
    });
  };

  const handleSubmit = async (e) => {
    e.preventDefault();

    try {
      const response = await axios.post(
        `https://api.airtable.com/v0/${baseId}/Users`,
        {
          records: [
            {
              fields: {
                name: formData.name,
                email: formData.email,
                phoneNumber: auth.currentUser.phoneNumber,
                address: formData.address,
                location: formData.location,
                fssai: formData.fssai,
                ResturantName: formData.ResturantName,
                Password: formData.Password,
              },
            },
          ],
        },
        {
          headers: {
            Authorization: `Bearer ${apiKey}`,
            'Content-Type': 'application/json',
          },
        }
      );

      console.log('Data sent to Airtable:', response.data);
      
      setSubmitted(true);
    } catch (error) {
      console.error('Error sending data to Airtable:', error);
    }  
  };

  if(submitted = true){
    Navigate('./Confermation');
  }

  const logout = () => {
    auth.signOut();
  };

  return (
    <div className="main-container">
      <center>
        <form onSubmit={handleSubmit}>
          <div className="form-group">
            <label htmlFor="name">Enter your Full Name:</label>
            <input
              {/* 剩余代码省略 */}
        </form>
      </center>
    </div>
  );
};

export default Mainpage;

错误原因及修复方案

1. 赋值运算符误用

条件判断里的if(submitted = true)是赋值操作,会直接把submitted设为true,应该改为if(submitted)或者if(submitted === true)。

2. Navigate组件使用错误

Navigate是React组件,不能直接在函数体中调用,必须在JSX中渲染,或者使用useNavigate钩子进行编程式导航(推荐)。

3. 组件导入错误

import './Confirmation';仅导入文件,未导入组件,应改为import Confirmation from './Confirmation';(假设Confirmation是默认导出组件)。

4. 路径拼写错误

导航路径./Confermation拼写错误,需与组件名一致,建议使用绝对路径如/confirmation(需配合路由配置)。


修复后的代码示例

方式一:使用useNavigate编程式导航(推荐)

import React, { useState } from 'react';
import axios from 'axios';
import { auth } from './firebase';
import { Link, Routes, Route, useNavigate } from 'react-router-dom'; // 导入useNavigate
import './mainpage.css';
import Confirmation from './Confirmation'; // 正确导入组件

const Mainpage = () => {
  const navigate = useNavigate(); // 获取导航函数
  const apiKey = '******';
  const baseId = '***********';
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    phoneNumber: '',
    address: '', // 补充初始state缺失字段
    location: '',
    fssai: '',
    ResturantName: '',
    Password: '',
  });

  const handleChange = (e) => {
    const { name, value } = e.target;
    setFormData({
      ...formData,
      [name]: value,
    });
  };

  const handleSubmit = async (e) => {
    e.preventDefault();

    try {
      const response = await axios.post(
        `https://api.airtable.com/v0/${baseId}/Users`,
        {
          records: [
            {
              fields: {
                name: formData.name,
                email: formData.email,
                phoneNumber: auth.currentUser.phoneNumber,
                address: formData.address,
                location: formData.location,
                fssai: formData.fssai,
                ResturantName: formData.ResturantName,
                Password: formData.Password,
              },
            },
          ],
        },
        {
          headers: {
            Authorization: `Bearer ${apiKey}`,
            'Content-Type': 'application/json',
          },
        }
      );

      console.log('Data sent to Airtable:', response.data);
      
      // 提交成功后直接导航到确认页
      navigate('/confirmation', { replace: true }); // replace防止用户后退回到表单
    } catch (error) {
      console.error('Error sending data to Airtable:', error);
    }  
  };

  const logout = () => {
    auth.signOut();
  };

  return (
    <div className="main-container">
      <center>
        <form onSubmit={handleSubmit}>
          <div className="form-group">
            <label htmlFor="name">Enter your Full Name:</label>
            <input
              {/* 剩余代码保留 */}
        </form>
      </center>
    </div>
  );
};

export default Mainpage;

方式二:条件渲染Navigate组件

若坚持用状态判断渲染,替换原if语句:

if(submitted) {
  return <Navigate to="/confirmation" replace />;
}

路由配置注意事项

确保在路由根组件(如App.js)中配置确认页路由:

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Mainpage from './Mainpage';
import Confirmation from './Confirmation';

function App() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Mainpage />} />
        <Route path="/confirmation" element={<Confirmation />} />
        {/* 其他路由 */}
      </Routes>
    </Router>
  );
}

export default App;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:58:11