开发者问题收集

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