【发布时间】:2017-01-11 03:48:22
【问题描述】:
假设我有两个组件。父对象作为属性传递给对象,然后将其复制到本地数据存储中。它具有更新此本地存储的功能,该存储被传递给子级。这是我的父组件:
const Parent = ({stuff}) => {
const store = {
stuff: Object.assign({}, stuff);
}
const updateStuff = (thing, property) => store.stuff[thing].property = thing;
return <Child stuff={stuff} updateStuff={updateStuff} />
}
子组件具有类似的结构——它复制stuff,并在<input> 的onChange 上改变其stuff 的副本。然后它将自己更新的内容副本传递给它收到的updateStuff 函数,以改变父项的道具副本。这是孩子。
const Child = ({stuff, updateStuff}) => {
const stuff = {
thing1: Object.assign({}, stuff.thing1),
thing2: Object.assign({}, stuff.thing2)
}
const setProp = event => {
const update = event.target.value;
stuff.thing1.prop = update;
updateStuff(thing1, stuff.thing1.prop)
}
return (
<div>
<input id="thing1" onChange={setProp} />
<input id="thing1" onChange={setProp} />
</div>
)
}
注意,我使用 Object.assign 基本上克隆了 stuff 属性或其子属性,视情况而定。原因:React prop 是只读的,因此我需要创建一个克隆以进行更改,然后再将其传递回以改变应用程序的状态(此处未显示)/
现在,这适用于子组件——setProp 改变了stuff 的正确属性,通过登录控制台确认。但是,当方法到达 updateTeam 时,我收到一条错误消息:Uncaught TypeError: Cannot assign to read only property 'side' of object '#<Object>'
然而,两个组件都使用相同的原则:我不是在改变 prop,而是在改变本地存储的 prop 克隆。为什么这对 Child 有效,但对 Parent 无效?
【问题讨论】:
-
这可能是 Object.assign 只做浅拷贝的结果。 Object.asssign reference。你能在你做 Object.assign() 的任何地方尝试深度克隆对象吗?类似
newStuff: JSON.parse(JSON.stringify(stuff))。我的想法是对象的较低级别部分并不是真正的副本。 -
这实际上解决了问题。如果您将其格式化为答案,我很乐意接受它作为正确答案。
-
所以我猜我的 Parent 组件中
stuff的属性实际上是对实际stuff属性的属性的引用。这是一个正确的分析吗,@BrandonRoberts? -
为什么同样的事情不适用于我的子组件?
-
如果在 App.js 中启用了严格模式,则可以使用
let代替const即const stuff = { thing1-> 到let stuff = { thing1
标签: javascript reactjs