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)