2017-08-16 146 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.....) 
}) 

它將會很好地工作。