将 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