Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何断开子道具与父道具的连接';美国的州通过了吗?_Javascript_Reactjs_Ecmascript 6 - Fatal编程技术网

Javascript 如何断开子道具与父道具的连接';美国的州通过了吗?

Javascript 如何断开子道具与父道具的连接';美国的州通过了吗?,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我已经看到很多关于从子组件更新父组件状态的问题,但是我的问题正好相反。我有一个组件,一个模态编辑窗口,用于修改存储在父级状态下的对象。 我只想在用户保存这些更改时将这些更改复制到父组件,这些更改由我传递给子组件的函数处理。 当前,每当我更改子对象中的prop.obj时,父对象会在重新渲染时拾取更改 下面是我的一个更改处理程序的示例 handleChange(e) { this.state.childobj.myvaluetochange = e.target.value } 如前所述,

我已经看到很多关于从子组件更新父组件状态的问题,但是我的问题正好相反。我有一个组件,一个模态编辑窗口,用于修改存储在父级状态下的对象。 我只想在用户保存这些更改时将这些更改复制到父组件,这些更改由我传递给子组件的函数处理。 当前,每当我更改子对象中的prop.obj时,父对象会在重新渲染时拾取更改

下面是我的一个更改处理程序的示例

handleChange(e) {
    this.state.childobj.myvaluetochange = e.target.value
}
如前所述,在我的父母中,我将obj从父母的状态传递给孩子,如下所示

<MyComponent obj={this.state.obj} />

总结如下:

我向一个孩子发送一个state对象

子对象使用this.props.obj在表单中使用此obj,并使用处理程序进行更新

当在子对象中拾取更改时,它们会在更新时反映在父对象的状态对象上-我不希望这样,除非它们选择保存。(这由从父级传入的函数处理)

为了澄清这一点,我希望传递给孩子的状态obj在孩子身上作为一个完全独立的对象。这可能吗


谢谢

发生这种情况是因为您正在变异给定的道具


为了避免这种情况,您应该创建“this.props.obj”的新实例。可能您希望在“componentWillMount”和“componentWillReceiveProps”生命周期方法中实现这一点。若要创建对象的新实例,可以使用object.assign或spread运算符。

发生这种情况是因为您正在变异给定的属性


为了避免这种情况,您应该创建“this.props.obj”的新实例。可能您希望在“componentWillMount”和“componentWillReceiveProps”生命周期方法中实现这一点。要创建对象的新实例,可以使用object.assign或spread运算符。

您正在创建指向父对象的链接,然后改变将反映在父对象中的状态。解决此问题的一种简单方法是通过使用“扩展”操作符创建新对象来创建新版本:

this.state = {childObj: {...this.props.obj}}

您正在创建指向父对象的链接,然后更改将反映在父对象中的状态。解决此问题的一种简单方法是通过使用“扩展”操作符创建新对象来创建新版本:

this.state = {childObj: {...this.props.obj}}

我只需克隆您传递的状态,并将其视为该组件的本地状态。看,这是我的第一个想法。我创建了一个我传入的对象的克隆,并将其设置为我的状态,但它仍然设置父对象的状态。在此之前,我只是将道具设置为孩子的状态,但效果相同
this.state={childobj:this.props.obj}
我只需克隆您传递的状态并将其视为该组件的本地状态。看,这是我的第一个想法。我创建了一个我传入的对象的克隆,并将其设置为我的状态,但它仍然设置父对象的状态。在此之前,我只是将道具设置为孩子的状态,但效果相同
this.state={childobj:this.props.obj}
嘿,谢谢你的建议。根据这些信息,似乎有其他事情正在发生,因为即使我创建了另一个副本,它仍然会反映在父对象上。我已经三次检查了传入的函数,甚至在保存时删除了对孩子的obj的引用,仍然存在这个问题。再次感谢您的帮助。在更改时,您似乎正在更新父对象(通过道具),您需要通过引用this.state.childobj.myvaluetochange来使用组件版本。我看到了,实际代码确实引用了我孩子的obj。为了清晰起见,我将更新代码片段。谢谢你指出这一点!可能是其中之一。嘿,谢谢你的建议。根据这些信息,似乎有其他事情正在发生,因为即使我创建了另一个副本,它仍然会反映在父对象上。我已经三次检查了传入的函数,甚至在保存时删除了对孩子的obj的引用,仍然存在这个问题。再次感谢您的帮助。在更改时,您似乎正在更新父对象(通过道具),您需要通过引用this.state.childobj.myvaluetochange来使用组件版本。我看到了,实际代码确实引用了我孩子的obj。为了清晰起见,我将更新代码片段。谢谢你指出这一点!可能是其中的一个陷阱。是的,我在ComponentWillMount中尝试过这个(这个不是被贬低了吗?),但我仍然有我的问题。正如我在上面的评论中所说的那样,我认为基于文档和每个人的建议,我的更改不应该返回给家长。谢谢你的帮助,我会继续挖掘的!是的,我在ComponentWillMount中尝试了这一点(这不是贬值了吗?)。正如我在上面的评论中所说的那样,我认为基于文档和每个人的建议,我的更改不应该返回给家长。谢谢你的帮助,我会继续挖掘的!