React 中子组件的 props 更新延迟
2019-10-23
2963
在我的父组件中,我有一个按钮,该按钮获取所选项目的对象并在子组件的输入字段中呈现。
父组件呈现,
<h4 className="table-title">Status</h4>
<div className="table-box">
{
props.table_data.map((item, idx) => {
if (item.profiledata) {
return (
<div>
<h4 className="profile-title">
<Button className="release-option-button" onClick={() => this.handleOpen('remove-release-profile', item)}>Remove Profile</Button>
</h4>
<Table columnWidths={[140, 220, 260, 140, 310]} numRows={item.profiledata.length}>
...
</Table>
</div>
)
}
})
}
</div>
每当我单击按钮
release-option-button
时,我都会
setState
将 currRelease 设置为
item
。
然后我渲染,
<EditDialog open={isOpen.EDIT_RELEASE} closeDialog={handleClose} selected_item={currRelease} />
并将
currRelease
作为
props.selected_item
传递。
在我的子组件中,
const init_fields = {
release: props.selected_item.release,
manager: props.selected_item.manager,
start_date: props.selected_item.start,
end_date: props.selected_item.end,
profiles: props.selected_item.profiledata,
}
const EditDialog = (props) => {
// State Hooks
const [fields, setFields] = useState(init_fields)
...
并在输入字段中呈现这些值
<h5>Version</h5>
<p>
<input
value={fields.release}
className="input-field"
type="text"
/>
</p>
但是,每当我选择一个项目时,它都会呈现先前选择的项目的字段,而不是当前项目的字段。好像更新道具有延迟。
有办法解决这个问题吗?
1个回答
您正在从传入的 props 生成 EditDialog 的本地状态。使用
useState
,您传递的参数只是状态的初始值。如果您想根据 props 的变化更新状态,可以使用可以响应 prop 变化的
useEffect
。
useEffect(() => {
setFields({
release: props.selected_item.release,
manager: props.selected_item.manager,
start_date: props.selected_item.start,
end_date: props.selected_item.end,
profiles: props.selected_item.profiledata,
});
}, [props.selected_item])
但是,您可能需要重新考虑使用 state 来存储 props。这是一种 React 反模式,可能会导致类似这样的差异。
webdevdani
2019-10-23