Object 孩子们正在通过道具改变父母的状态……我不清楚原因

Object 孩子们正在通过道具改变父母的状态……我不清楚原因,object,reactjs,properties,state,children,Object,Reactjs,Properties,State,Children,我有一个React组件,它将一个对象传递给一个子元素,该子元素包含一个输入字段,该字段将通过传递的函数进行修改。输入字段正在更改子元素的状态,但不知何故,在不调用传递的函数的情况下,props对象正在被修改 这是父类的渲染函数: render: function() { const newTriggerClass = this.state.item.triggerID === "" ? " new-trigger" : ""; return (

我有一个React组件,它将一个对象传递给一个子元素,该子元素包含一个输入字段,该字段将通过传递的函数进行修改。输入字段正在更改子元素的状态,但不知何故,在不调用传递的函数的情况下,props对象正在被修改

这是父类的渲染函数:

render: function() {
    const newTriggerClass = this.state.item.triggerID === ""
        ? " new-trigger"
        : "";
    return (
        <div className={newTriggerClass}>
            <div className="triggers-detail">

                <section className="trigger-info group">
                    <TriggerInfoEntry
                    item={this.state.item}
                    triggerState={this.state.editTriggerState}
                    columnHeaders={this.props.columnHeaders}
                    hideDetail={this.hideDetail}
                    editAction={this.props.editAction}
                    editToggle={this.editToggle}
                    _onChange={this._onInfoChange}
                    createAction={this.props.createAction}
                    deleteAction={this.props.deleteAction}/>
                </section>

                <section className="trigger-actions group">
                    <TriggerActionEntry
                    item={this.state.item}
                    actionState={this.state.editActionState}
                    editToggle={this.editToggle}
                    editAction={this.editTriggerAction}
                    actionIndex={this.state.selectedActionIndex}/>
                </section>
            </div>
            <div className={"modal-overlay" + newTriggerClass}>
            </div>
        </div>
    );
},
当我通过输入更改子组件(state.item)的状态时,父组件的状态会更改!我不确定原因。我在网上读到的任何东西都没有提到这种行为。感谢您的帮助

更新: @garrettmaring我用于更改状态的代码仅用于在getInitialState中设置为
this.props.item
assign
的克隆的子状态,这是我的
对象assign
的别名,它是
对象。assign
ponyfill。要更改
项的表单实际上又下了一个子项。下面是
TriggerActionEntry

<div>
                    <TriggerActionForm
                    action={this.state.item.actions[this.state.actionIndex]}
                    index={this.state.actionIndex}
                    addNewAction={this.addNewAction}
                    editTriggerAction={this.editTriggerAction}
                    deleteTriggerAction={this.deleteTriggerAction}
                    editState={this.state.editState}
                    deleteState={this.props.actionState}
                    toggleEdit={this.toggleEdit}
                    activateEdit={this.activateEdit}/>
 </div>
即使在我卸载该组件时,TriggerActionEntry
state.item
也会被修改,并在再次装载该组件时以修改状态显示


更新2:好的,问题是
Object.assign
Object assign
都没有深度克隆对象。经典!这些操作是嵌套在
中的对象,而不是克隆,而是创建了对嵌套对象的另一个引用。谢谢大家的帮助。

我现在也在做同样的事情。父函数将数据作为道具传递给子函数。(我用钩子代替类)。子组件用于处理父组件提供的数据并导出为pdf或excel。将数据作为包含多个对象数组的对象传入。每个子对象都有一个proj id元素,我想删除它。数据传入的那一刻,我就有了这个


我使用从父级传入的数据设置状态。当我经历一些过程并移除项目时。当我尝试使用父函数中的任何元素访问时。整个东西都坏了。

我现在正在做同一件事。父函数将数据作为道具传递给子函数。(我用钩子代替类)。子组件用于处理父组件提供的数据并导出为pdf或excel。将数据作为包含多个对象数组的对象传入。每个子对象都有一个proj id元素,我想删除它。数据传入的那一刻,我就有了这个


我使用从父级传入的数据设置状态。当我经历一些过程并移除项目时。当我尝试使用父函数中的任何元素访问时。整个东西都坏了。

Hmm,你试过
Object.assign({},{testy:true},this.props.item)
getInitialState
函数中吗?或者在传递此.state.item之前创建其克隆。这似乎是一个参考问题。也就是说,即使您在
getInitialState
中使用assign,子组件中的项仍保留对父组件中的
状态的引用。item
。@suntruth显示您在子元素上使用的
setState
代码。看起来您正在更改对象的属性,如果这是真的,那么它与父元素具有相同的对象引用,因此它也会更改。如果要为项目设置新状态,则应在使用
setState
时完全创建一个新对象,不仅要对项目使用assign,还要对整个对象使用assign。@garrettmaring,我为问题添加了更多细节。感谢您的响应我将尝试在getInitialState之外进行克隆,看看这是否是问题所在。嗯,您是否尝试过
Object.assign({},{testy:true},this.props.item)
函数中的
getInitialState
呢?或者在传递此.state.item之前创建其克隆。这似乎是一个参考问题。也就是说,即使您在
getInitialState
中使用assign,子组件中的项仍保留对父组件中的
状态的引用。item
。@suntruth显示您在子元素上使用的
setState
代码。看起来您正在更改对象的属性,如果这是真的,那么它与父元素具有相同的对象引用,因此它也会更改。如果要为项目设置新状态,则应在使用
setState
时完全创建一个新对象,不仅要对项目使用assign,还要对整个对象使用assign。@garrettmaring,我为问题添加了更多细节。感谢您的回复,我将尝试在getInitialState之外进行克隆,看看这是否是问题所在。
<div>
                    <TriggerActionForm
                    action={this.state.item.actions[this.state.actionIndex]}
                    index={this.state.actionIndex}
                    addNewAction={this.addNewAction}
                    editTriggerAction={this.editTriggerAction}
                    deleteTriggerAction={this.deleteTriggerAction}
                    editState={this.state.editState}
                    deleteState={this.props.actionState}
                    toggleEdit={this.toggleEdit}
                    activateEdit={this.activateEdit}/>
 </div>
_onChange: function (e) {
    e.preventDefault();
    let newAction = assign({}, this.state.action);
    const keyname = e.currentTarget.dataset.keyname;
    if (keyname === "minDelay") {
        newAction[keyname] = e.currentTarget.value;
    } else {
        newAction.args[keyname] = e.currentTarget.value;
    }
    this.setState({action: newAction});
    if (!this.props.editState) {
        this.props.activateEdit();
    }
},