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

React+Rails API应用表单输入触发无限循环问题求助

React表单输入无限循环及API调用异常问题

问题描述

我开发了一个以Rails作为API后端的React应用,在使用AddCreation组件渲染的新增信息表单中输入内容时,页面会陷入无限循环。修改路由配置后,循环问题消失,但表单无法调用后端API(已通过console.log确认表单值已正常传递)。

原AddCreation组件代码

import React, { useState } from 'react';
import { useSelector } from 'react-redux';
import { useForm } from 'react-hook-form';
import { useNavigate } from 'react-router-dom';
import { getToken } from '../redux/actions/auth';
import axios from 'axios';

const AddCreation = () => {
  const { reset } = useForm();
  const navigate = useNavigate();
  const [creation, setCreation] = useState({});
  const { currentUser } = useSelector((state) => state.auth);

  if (currentUser.role !== 'admin') {
    navigate('/');
  }

  const handleChange = (e) => {
    e.preventDefault(); 
    setCreation({ ...creation, [e.target.name]: e.target.value });
    console.log(creation)
  };

  const handleSubmit = (e) => {
    e.preventDefault();
    const data = new FormData();
    const img = document.getElementById('art_image');

    data.append('image_url', img.files[0]);
    // data.append('journeyman_id', parseInt(id, 10));
    data.append('artist', creation.artist);
    data.append('title', creation.title);
    data.append('type_of_work', creation.type_of_work);
    data.append('medium', creation.medium);
    data.append('dimensions', creation.dimensions);
    data.append('date_of_composition', creation.date_of_composition);
    data.append('art_category', creation.art_category);
    data.append('comment', creation.comment);
    data.append('price', creation.price);
    
    axios.post('http://localhost:3001/v1/creations', data, {
      headers: {
        'Content-Type': 'multipart/form-data',
        Authorization: getToken(),
      },
    })
      .then((response) => {
        console.log(response);
        navigate('/');
      })
      .catch((error) => {
        console.log(error);
      });
    reset();
  };

  return (
    <main className="">
      <div className="my-5 d-flex flex-column align-items-center">
        <h2>Add a Creation to Listing</h2>
        <form className="my-5 d-flex flex-row justify-content-center border border-dark" onSubmit={handleSubmit}>
          <div className="my-5 mx-5">
            
            <div className="d-flex flex-row justify-content-between my-3">
              <label
                className=""
                htmlFor="artist-name"
              >
                Artist Name:
              </label>
              <input
                className=""
                id="artist"
                type="text"
                name="artist"
                onChange={handleChange}
                required
              />
            </div>
            
            <!-- 其他输入项省略 -->

            <div className="my-3">
              <button className="btn btn-primary btn-lg" type="submit" >
                Add Creation
              </button>
            </div>
          </div>
        </form>
      </div>
    </main>
  );
};

export default AddCreation;

输入内容时的错误提示

react_devtools_backend.js:2655 Warning: Cannot update a component (`BrowserRouter`) while rendering a different component (`AddCreation`). To locate the bad setState() call inside `AddCreation`, follow the stack trace as described in https://reactjs.org/link/setstate-in-render

原App.js路由配置

import './App.css';
import 'bootstrap/dist/css/bootstrap.css';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import ProtectedRoutes from './components/ProtectedRoutes';
import useAuth from './hooks/useAuth';
import Signup from './components/Signup';
import Login from './components/Login';
import Creations from './components/Creations';
import AddCreation from './components/AddCreation';

function App() {
  const { authChecked, loggedIn } = useAuth();

  return (
    <Router>
      <Routes>
        <Route path="/login" element={<Login loggedIn={loggedIn} />} />
        <Route path="/signup" element={<Signup />} />
        <Route element={<ProtectedRoutes isAllowed={loggedIn} authChecked={authChecked} redirectPath="/login" />}>
          <Route path="/creations" element={<Creations />} />
          <Route path="/" element={<AddCreation />} />
        </Route>
      </Routes>
    </Router>
  );
}

export default App;

修改后的路由配置(循环问题消失,但API调用失败)

<Route element={<ProtectedRoutes isAllowed={loggedIn} authChecked={authChecked} redirectPath="/login" />}>
  <Route path="/creations" element={<Creations />} />
  <Route path="/add-creation" element={<AddCreation />} />
</Route>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:35:01