为什么this.setState不更新我的状态?

时间:2019-03-15 07:05:36

标签: reactjs

为此,我有很多代码可以在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显示旧信息,并且从不更新。

3 个答案:

答案 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()。