【发布时间】:2021-04-11 05:21:39
【问题描述】:
我有一个父组件,在提交子组件上的表单时应该更新它。子组件提交表单时,调用了fetchData函数,但是这里父组件没有更新数据,需要刷新页面才能更新数据:
{JSON.stringify(data)}
我无法将 setState 中的 数据 添加到 useEffect,因为它会创建一个无限循环。
从子组件提交表单时,如何更新父组件上的数据?
父组件
export function ParentComponent() {
const [data, setData] = useState(null);
const fetchData = async () => {
const result = await axios(
'/api/info/'
);
setData(result.data)
}
useEffect(() => {
fetchData();
},[]);
return (
<div>
<h1>
Parent Page
</h1>
{JSON.stringify(data)}
<ChildComponent dataUpdated={fetchData} />
</div>
)
}
子组件
export function ChildComponent(props) {
const [formData, setFormData] = useState('');
const handleSubmit = evt => {
evt.preventDefault();
axios.post(`/api/info/create`,
{formData}
)
.then(response => { return response.data })
.then(props.dataUpdated()) // calling this function does not update the data on the parent component
}
return (
<div>
<h1>
Child Component
</h1>
<form className={classes.form} onSubmit={handleSubmit}>
<TextField value={formData.number}
id="filled-number"
label="number"
type="number"
onChange={evt => setFormData({...formData, number: evt.target.value})}
/>
<Button
type="submit"
>
Submit
</Button>
</form>
</div>
)
}
【问题讨论】:
-
孩子中最后一个
then应该是props.dataUpdated之后没有() -
@fast-reflexes,这行得通,谢谢,但为什么行得通?没有括号怎么调用函数表达式?
-
我相信我找到了原因。由于函数被热切地评估,我编写的函数会在 then 被调用之前被调用。 stackoverflow.com/a/52769736/3856624
-
答案是
.then将函数作为参数,当您执行props.dataUpdated()时,您运行该函数并为then提供它的返回值,以便在它应该运行的时候运行。fetchData的返回值是undefined,因此您将undefined作为参数传递给then,这当然是行不通的。当您删除括号时,您为then提供了一个带有 0 个参数的函数,该函数在应该运行时运行良好。 -
@fast-reflexes,如果您将此作为答案,我会接受。谢谢你的信息。
标签: javascript reactjs asynchronous react-hooks