Javascript 反应-一个对象中的变化反映在另一个对象上,即使它未被修改

Javascript 反应-一个对象中的变化反映在另一个对象上,即使它未被修改,javascript,reactjs,Javascript,Reactjs,如果我将同一个对象指定给两个状态对象,我将尝试更改另一个对象反射的对象的值。例如,服务返回如下所示的数据 formData = { 'name':'name', 'data':{ 'value':'value', 'isactive':false } }; 我试图将同一个对象分配给两个不同的状态对象 this.setState({ formdata: formdata, initialFormData : formdata }); 如果我修改form

如果我将同一个对象指定给两个状态对象,我将尝试更改另一个对象反射的对象的值。例如,服务返回如下所示的数据

formData = {
  'name':'name',
  'data':{
    'value':'value',
    'isactive':false
    }
};
我试图将同一个对象分配给两个不同的状态对象

this.setState({ 
  formdata: formdata,
  initialFormData : formdata
});
如果我修改formdata上的任何内容,都会反映在initialFormData上。 我用表单映射了formdata。如果我修改名称,它应该只反映在formdata上,但它也会修改initialFormData,但我不希望我的initialFormData不被更改,因为如果有人单击reset按钮,我需要用initialFormData重置整个数据

如何实现同样的目标。请帮我做这个。提前谢谢


如果您需要更多信息,请在下面进行评论。我可以提供同样的。

我想你想要这样:

// outside the class
const initialFormData = {
  // your initial data
}
// inside the class
state = {
  formData: initialFormData
}
// when you want to update with initial data
this.setState({
  formData: initialFormData
})

初始
setState
(来自服务的数据)保存对一个(基本)对象的引用。这样,两个值都是指向相同数据的指针这可以通过这种方式完成(对于初始渲染)-问题在于字段处理程序、变异状态方法

通过访问
this.state.formdata
来获取指向基本对象的指针。改变此值将更改此对象,而不是(根据需要)存储在
this.state.formdata
中的值(对象)

let formdata = this.state.formdata; // OLD REFERENCE
formdata[field] = evt.value; // THIS WAY YOU"RE MUTATING BASE OBJECT
this.setState({ formdata: formdata }); // STILL THE SAME REFERENCE
您需要准备一个新对象(深度克隆)并在
setState()中使用它

需要深度克隆,因为基本对象
formData
包含
data
对象。通常的方法(分配、排列)是进行浅层复制-他们将复制<代码>数据参考。这样,f.e.突变
数据.isActive
仍将影响状态中的两个值


了解差异。

这很有效。您希望为处于状态的两个项复制表单数据对象。因此,这将很好地工作

  let formData = {
  'name':'name',
  'data':{
  'value':'value',
  'isactive':false
 }
}; 

let State = { 

 initialFormData:Object.create(formData),
 formDat:Object.create(formData)
};

console.log(State)

不我需要维护来自服务ie formdata和initial formdata的两个对象的副本,并分配相同的副本。但是,如果我修改任何一个formdata,更改都会反映在initialformdata上。我想知道如何避免它答案应该满足你的要求。请让我知道为什么不行?这对我来说第一次就行了。如果我第二次修改相同的对象,那么initialFormData会被修改吗?不会的。
  let formData = {
  'name':'name',
  'data':{
  'value':'value',
  'isactive':false
 }
}; 

let State = { 

 initialFormData:Object.create(formData),
 formDat:Object.create(formData)
};

console.log(State)