reactjs 太多重新呈现,react限制呈现的数量以防止无限循环,即使函数是好的

yk9xbfzb  于 2022-11-04  发布在  React
关注(0)|答案(2)|浏览(158)
import React, { useState } from "react";
import { Link } from "react-router-dom";

const Form = (props) => {
  const [submit, setSubmit] = useState(false);

  const [inputData, setInputData] = useState({
    firstname: "",
    location: ""
  });

  const InputHandle = async (event) => {
    setInputData({ ...inputData, [event.target.name]: event.target.value });
  };
return (
    <div>
      <form id="form" method="GET">
        <div className="inputs">
          <label for="firstname"> First Name</label>
          <input
            type="text"
            id="firstname"
            name="firstname"
            onChange={InputHandle}
          ></input>
        </div>
<div className="inputs">
          <label for="location">User accessing application from</label>
          <input
            type="text"
            id="location"
            name="location"
            onChange={InputHandle}
          ></input>
          <Link to="/dashboard">
            <button
              type="submit"
              className="btn"
              onClick={() => {
                props.getData(inputData);
              }}
            >
              Submit
            </button>
          </Link>
        </div>
      </form>
    </div>

App.js

import Dashboard from "./components/Dashboard";
import Form from "./components/Form";

import "./App.css";
import {
  BrowserRouter as Router,
  Switch,
  Routes,
  Route,
  Link,
} from "react-router-dom";
import { useState } from "react";

function App() {
  const [data, setData] = useState({});

  const getData = (inputData) => {
    setData(inputData);
  };

  return (
    <Router>
      <div className="App">
        <Routes>
          <Route exact path="/" element={<Form getdata={getData()} />}></Route>
          <Route
            exact path="/dashboard" element={<Dashboard data={data} />}
          ></Route>
        </Routes>
      </div>
    </Router>
  );
}

export default App;

我得到这个错误“太多的重新渲染。react限制渲染的数量以防止无限循环。”我不知道我到底做错了什么,有人可以帮助吗。为了帮助你理解:我已经创建了一个表单,希望在其中输入(名称和位置),并在不同的页面上显示输入。我试图集成GoogleMaps API来根据输入显示位置,但整个代码崩溃了,否则它早些时候工作得很好,还有,如果有人能帮我在这里的Map太多?我一直在撞我的头试图这样做。我可以在不同的页面上显示Map,但我希望当用户在表单的输入字段中输入任何位置时,显示Map上的位置,希望我能理解。

nukf8bse

nukf8bse1#

看起来这行代码在每次呈现时都会调用getData(),然后将undefined作为prop值传递:

<Route exact path="/" element={<Form getdata={getData()} />}></Route>

getData调用一个状态设置器,这似乎会导致无限循环。
我认为它应该改为用途:

getdata={getData}
csbfibhn

csbfibhn2#

这是两个问题。第一个问题是由@JLRishe回答的。第二个问题是您的表单prop被称为getdata而不是getData,因此函数不存在,表单无法正常工作。
这是您的最终代码

<Route exact path="/" element={<Form getData={getData} />}></Route>

你被困在循环中的原因是,把表单的属性设为getData={getData()},你是把函数的结果作为属性而不是函数发送,而这个函数在每次渲染时计算,这会导致另一次渲染。
在这里剥下Codepen

相关问题