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