2017-08-16 153 views
0

如何清除反应状态变量(Array)中的现有数据并为其分配另一个数组。我尝试了下面的东西,但它不起作用。如何清除反应状态数组?

itemsChanged(items) { 
     this.setState({item : []}) //item is my state variable 
     this.setState({item : items}) 
     console.log("ITEMS : ",this.state.item) //this will not print the updated value 
    } 

在此先感谢

+2

设置'this.setState({item:items})'应该已经覆盖现有的数组,如果它是一个不同的项目集合。 'setState'是异步的,所以你的控制台可能会在动作实际完成之前触发。 – LoganRx

+0

Pl通过这个:https:// stackoverflow。com/questions/42593202/why-calling-setstate-method-doesnt-mutate-the-state-immediately/42593250#42593250 – Dev

+0

要检查结果状态,您需要在处理程序中移动console.log,如下所示:'this。 setState({item:[]},function(){console.log(“ITEMS:”,this.state.item)})' –

回答

2

你并不需要先分配一个空数组。只需将新数组传递给它。它不工作的唯一原因是setState是一个异步调用。使用这样的

this.setState({item : items},() => console.log("ITEMS : ",this.state.item)) 
+0

它的工作原理谢谢@Murat K –

+0

@narenmnp请接受答案,如果它帮助你。 –

1

根据React's docs

阵营5批次多的setState()调用到性能更新一次。

如果你想检查setState后你的状态值,你应该做的,如:

this.setState({item : items},() => console.log(this.state.item));

0

setState是异步方法。所以,当你在控制台上打印它时,它仍然可以更新。您可以在返回呈现之前使用控制台日志。

... 

render(){ 
    console.log("ITEMS : ",this.state.item); 
    return (<div>...</div>) 
} 
... 
0

因为它们描述:

setState(updater, [callback]) 

,这样可以表明,它不是一个同步操作。

用途:

itemsChanged(items) { 
    var me = this; 

    me.setState({item : items}, function(){ 
     console.log("ITEMS : ", me.state.item); 
    }); 
} 
0

有一件事你应该了解有关setState的是,它以异步方式工作。如果您在拨打setState之后直接尝试拨打console.log,您将看不到任何更改。

你也不必通过调用setState来清空数组,你可以用新数组替换当前数组。

this.setState({ items: newItems });

如果你想登录的变化,我建议尝试做它在组件的componentShouldUpdate方法。

0

setState是一个异步函数,如果你书面方式代码为:

this.setState({xxState}) 
console.log(this.state.xxState) 

程序将执行console.log第一,所以你应该为写:

this.setState({xxx},()=> { 
    console.log(this.state.....) 
}) 

它将会很好地工作。