reactjs 未捕获的错误:尝试嵌套循环时,呈现的挂接比上一次呈现时多

t98cgbkg  于 2022-11-22  发布在  React
关注(0)|答案(1)|浏览(117)

我知道同样的问题可能被问了很多次,但我还是找不到我想要的答案。
这是任务的代码:

import Navbar from './Navbar';
import "./Idea.css";
import GetData from '../restApiMethods/GetData';
import React from "react";

function Task() {
    const ids = GetData("ideas/id");
    return (
        <div>
            <Navbar />
            <div className="idea-design">   
                <div className="container">
                    {
                        ids.map((id,index) => {
                            return (
                            <div key={index}>
                                {
                                GetData(`ideas/${id}`).map((task,index) => {
                                    return(
                                        <div key={index} className="row border border-secondary">
                                            <div className="col">
                                                <div> 
                                                    <p>{task.taskDescription}</p>
                                                </div>
                                            </div>
                                        </div>
                                    )
                                })
                                }
                            </div>
                            )
                        })
                    }
                </div>
                </div>
            </div>
      
      )
}

export default Task

获取数据函数:

import axios from "axios";
import {useState, useEffect}  from "react";

function GetData(data) {

    const [datas, setDatas] = useState([]);

    useEffect(() =>{ 
    const fetchData = () => {
    axios.get(`http://localhost:8080/api/${data}`).then(res =>{
    console.log(res);
    setDatas(res.data);
        });
    };
        fetchData();
    }, []);
      
    return datas;
}

export default GetData

如果有人能给予我为什么会出现此错误:渲染比上一次渲染更多的挂钩,将非常有帮助。

swvgeqrz

swvgeqrz1#

GetData实际上是custom hook,因为它是一个调用钩子的函数。
它应该被称为useGetData--我将在这个答案中引用它。你不能在循环中调用它,因为当ids数组改变长度时,对useGetData的调用次数将在父组件Task中改变。这在React中是不允许的,因为钩子应该是可预测的顺序,并且永远不会改变--它是一个声明性模型。
要解决这个问题,请创建一个名为Task的新组件(将当前组件重命名为Tasks或任何对您有意义的名称),并在其中调用它一次。这并不违反钩子的规则,因为只有 * 在一个组件内 *,调用次数才不能在渲染之间改变。
工作

import Navbar from "./Navbar";
import "./Idea.css";
import useGetData from "../restApiMethods/useGetData";
import React from "react";

import Task from "./Task";

function Tasks() {
  const ids = useGetData("ideas/id");
  return (
    <div>
      <Navbar />
      <div className="idea-design">
        <div className="container">
          {ids.map((id, index) => {
            return <Task id={id} key={id} />;
          })}
        </div>
      </div>
    </div>
  );
}

export default Tasks;

工作
第一次

相关问题