开发者问题收集

将 useState 函数作为 prop 传递给另一个组件

2022-01-12
7212

我尝试将 useState 函数传递给另一个 prop,但出现以下错误: Uncaught RangeError:超出最大调用堆栈大小

我将 useState 函数作为子组件中 buttonClick 的 handleevent 进行添加,我假设该错误意味着它在循环中被调用?有人能帮我理解这里的问题吗?代码如下:

    function App() {
        const[personListe, setPersonListe] = useState([
          {
            firstName:'Test',
            lastName:'testing',
            getFullName:function()
            {
                return `${this.firstName} ${this.lastName}`
            },
            age:28
            },
        ]);
  
      return (<>
          <Header />
          <h1>Welcome to my react page!</h1>
          <Inputfields personListe={personListe} addPerson={setPersonListe} />
          <PersonList personListe={personListe}/>
        </>
      );
    }

子组件(Inputfields.js):

export default function Inputfields({personListe}, {addPerson})
{
    function addPerson()
    {
        let firstName = document.getElementById("firstNameID");
        let lastName = document.getElementById("lastNameID");
        let age = document.getElementById("ageID");
        if(firstName.value.length < 1 || lastName.value.length < 1 || age.value.length < 1)
        {
            alert("Please fill out all the fields!");
        }
        else
        {
            addPerson(
                {
                    firstName:firstName.value,
                    lastName:lastName.value,
                    age:age.value
                }
            );
            firstName.value = "";
            lastName.value = "";
            age.value = "";

        }
    }
    return(
        <>
            <Input id="firstNameID" placeholder="First name" /> <br />
            <Input id="lastNameID" placeholder="Last name" /> <br />
            <Input id="ageID" placeholder="Age" type="number" /> <br />
            <Button variant="contained" sx={{marginTop:2}} onClick={addPerson}>Add person</Button>
        </>
    );
}
2个回答

这里有两个问题。首先,您没有正确地解构 props。传递给组件的 props 对象只有一个,而不是两个。从该对象中解构两个 props:

export default function Inputfields({personListe, addPerson})

其次,更重要的是...您永远不会 使用 此处传递的 addPerson prop。您的组件所做的第一件事是使用同名的新函数隐藏该变量:

function addPerson()
{
  //...
}

然后该函数递归调用自身,直到堆栈溢出。

不要隐藏变量。为函数赋予自己的名字。例如:

function myAddPerson()
{
  //...
}

然后,您可以在该函数中调用传递给组件的 addPerson 。在 JSX 标记中调用您的本地函数:

<Button variant="contained" sx={{marginTop:2}} onClick={myAddPerson}>Add person</Button>

基本上这根本不是 React 问题。这是纯 JavaScript。如果您为变量分配新值(并且用相同名称定义函数也会这样做),则原始值将丢失。

David
2022-01-12

你没有正确破坏道具功能,你需要这样做。

export default function Inputfields({personListe,addPerson}) {...rest of your code}
Borni.Mr
2022-01-12