为此,我有很多代码可以在3个不同的文件中列出,因此我将向您提供我认为对理解此问题至关重要的内容。
我有我的状态
state = { items: [], currentItem: {text:'', key:'', checked: false, textStrike: null}};
当我尝试在函数中设置setState时,console.log不会显示更新的信息。
completeItem = (item) => {
let itemsArr = [...this.state.items];
itemsArr.forEach((oneItem) => {
if(item.key === oneItem.key) {
this.setState({ checked: true, textStrike: 'strike'}, () => {
console.log(this.state.items)
})
}
});
};
console.log显示旧信息,并且从不更新。
答案 0 :(得分:0)
您是要这样做吗?
根据您的问题(初始状态),我想您应该使用
myStream.isBroadcast
在您的示例中,您不是在更新this.state.currentItem,而是在更新this.state 这意味着,您的新状态将是具有以下结构的对象:
this.setState({ currentItem: { checked: true, textStrike: 'strike' } })
另外,您正在验证不会更新的this.state.items,因此您应该执行{
"items":[],
"checked":true,
"textStrike":"strike"
}
或console.log(this.state.currentItem)
来进行验证
答案 1 :(得分:0)
将return语句添加到setState内的函数中
答案 2 :(得分:0)
首先,您在 console.log 中键入 this.state.items ,但是您没有在setState中设置 items (),因此项目不会更改。我相信这就是为什么您看不到任何变化的原因。
第二,在setState()中,设置以下对象:
describe('Angular site', function () {
let base = new BaseTest()
let ang = new angularsite()
beforeAll(function(){
//browser.get(base.StartTest(2));
browser.get("https://material.angular.io/components/autocomplete/overview")
})
})
但是根据您的状态结构,应该将其包装到currentItem中:
{
checked: true,
textStrike: 'strike'
}
最后,我对您的建议是不要在循环内调用setState()。我建议您先准备新状态,然后再调用一次setState()。