【问题标题】:Delay in props update in a child component in ReactReact 子组件中的道具更新延迟
【发布时间】:2019-10-23 18:36:07
【问题描述】:

在我的父组件中,我有一个按钮,它获取所选项目的对象并在子组件的输入字段中呈现。

父组件渲染,

<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>

但是,每当我选择一个项目时,它都会呈现先前选择的项目的字段,而不是当前项目。好像更新道具有延迟。

有没有办法解决这个问题?

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您正在从传入的道具生成 EditDialog 的本地状态。使用useState,您传递的参数只是状态的初始值。如果你想根据 props 的变化来更新 state,你可以使用 useEffect 来响应 props 的变化。

    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])
    

    但是,您可能需要重新考虑使用状态来存储道具。这是一种 React 反模式,可能会导致这样的差异。

    【讨论】:

    • 嗨。谢谢。这行得通。但我没有得到最后一部分you might want to reconsider using the state to store props。为什么这是反模式?即使我将代码更改为您的答案,它仍然是反模式吗?
    • 您通常只想拥有一个值的真实来源。在您的情况下,是状态还是道具?您将变量“字段”用于什么?也许您可以仅在需要时制作该对象。如果它是另一个组件的道具,请考虑根据道具在渲染中制作对象
    • 关于在 state 中存储 props 的失败的好文章:blog.bitsrc.io/…
    • 谢谢。就我而言,事实的来源是我存储在我的 redux-store 中的状态。在我的模式中,我使用 API 调用来更新这些字段。这些调用将对存储进行更改。我在我的子组件(对话框)中使用道具来显示当前值或所选对象的字段。
    • 你肯定会想要依赖这里的道具。如果解决了问题,请不要忘记接受答案
    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 2018-11-25
    • 2019-03-03
    • 2019-08-03
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    相关资源
    最近更新 更多