Reactjs 使用Object.assign设置状态正在丢失状态中的密钥
让我先说我是一个反应迟钝的人 我在componentDidMount准备/设置我的状态中获取数据。我有一个远程API端点,可以输出JSON数据,它看起来像这样Reactjs 使用Object.assign设置状态正在丢失状态中的密钥,reactjs,Reactjs,让我先说我是一个反应迟钝的人 我在componentDidMount准备/设置我的状态中获取数据。我有一个远程API端点,可以输出JSON数据,它看起来像这样 "popup": { "background": "bg", "url": "", "title": { "text": "title", "color": "#222", "bgColor": "#fff" }, "button": { "tex
"popup": {
"background": "bg",
"url": "",
"title": {
"text": "title",
"color": "#222",
"bgColor": "#fff"
},
"button": {
"text": "button",
"color": "#222",
"bgColor": "#567834"
},
"termsAndConditions": {
"text": "termsAndConditions",
"color": "#222",
"bgColor": "#fff"
}
}
基于这些数据,我正在呈现一个无状态组件,我正在将道具传递给它
这就是我的初始状态
this.state = {
popup: {
background: "",
button: {
color: "",
bgColor: "",
buttonRounded: false,
text: "",
},
termsAndConditions: "",
title: {
bgColor: "",
color: "",
text: ""
}
}
}
现在是从表单中更新“title”部分的值的时候了。所以我把它的状态设置成这样
handlePopupTitle(e) {
this.setState({
popup: {
title: {
text: e.target.value.trim()
}
}
})
}
handlePopupTitle(e) {
const newState = Object.assign( {}, this.state.popup, {
title: {
text: e.target.value
}
})
this.setState({
popup: newState
})
}
然而,很快我就意识到React将覆盖我当前的状态,只会离开
popup: {
title: {
text: "whatever my input value is"
}
}
所以,我使用Object.assign来创建一个新对象,并使用它来设置一个状态,因为改变你的状态显然是一个大问题
现在,我的事件处理程序如下所示
handlePopupTitle(e) {
this.setState({
popup: {
title: {
text: e.target.value.trim()
}
}
})
}
handlePopupTitle(e) {
const newState = Object.assign( {}, this.state.popup, {
title: {
text: e.target.value
}
})
this.setState({
popup: newState
})
}
但现在的问题是,我只更新“title”对象中的“text”键,而所有其他键(如“color”、“bgColor”)都丢失了,因为我只设置了“text”
我试着将Object.assign放在另一个Object.assign中,但对我来说这似乎不是一个理想的解决方案。还有一点需要注意的是,我不能更改我的状态的嵌套结构,因为我的数据结构不会改变
感谢一个更简单、更容易的解决方案是使用
不变性助手
npm包
import update from 'immutability-helper';
.....
var newState = update(state, {
popup: {
title: {
text: {
$set: e.target.value;
}
}
}
})
查看了解更多信息一个更简单、更容易的解决方案是使用
不变性助手
npm包
import update from 'immutability-helper';
.....
var newState = update(state, {
popup: {
title: {
text: {
$set: e.target.value;
}
}
}
})
查看了解更多信息我也使用了它,但随后我在控制台中看到一个未捕获的错误,表示对象作为React子对象无效(找到:具有键{text,color,bgColor}的对象)。如果要呈现子对象集合,请改用数组,或使用React附加组件中的createFragment(object)包装对象“我不知道这意味着什么,所以我假设我做错了什么,所以我恢复了我的codeShubham,我确信这个错误与我在无状态组件中呈现状态的方式有关。如果我的状态像一个数组,这不会发生,但我没有选择。但是,你已经回答了我的问题,所以我会接受这是最好的答案。谢谢,老兄,你的意思是你的问题解决了,或者有另一个错误,还有另一个错误,但这与我所在州的结构有关。它是一个嵌套对象。因此,我得到的对象作为React子对象无效(发现:具有键{text,color,bgColor}的对象)。如果要呈现子对象的集合,请使用数组,或者使用React add onsI中的createFragment(object)包装对象。我也使用了该方法,但是我在控制台中看到一个未捕获的错误,表示对象作为React子对象无效(找到:具有键{text,color,bgColor}的对象)。如果要呈现子对象集合,请改用数组,或使用React附加组件中的createFragment(object)包装对象“我不知道这意味着什么,所以我假设我做错了什么,所以我恢复了我的codeShubham,我确信这个错误与我在无状态组件中呈现状态的方式有关。如果我的状态像一个数组,这不会发生,但我没有选择。但是,你已经回答了我的问题,所以我会接受这是最好的答案。谢谢,老兄,你的意思是你的问题解决了,或者有另一个错误,还有另一个错误,但这与我所在州的结构有关。它是一个嵌套对象。因此,我得到的对象作为React子对象无效(发现:具有键{text,color,bgColor}的对象)。如果要呈现子对象集合,请改用数组,或使用React附加组件中的createFragment(object)包装对象