2017-08-28 55 views
4

更新狀態我已經得到了我在子組件的forEach循環運行功能,該功能與結果進行過濾的數據,並更新狀態。 的問題是,當我重複的功能與它在同一時間之內這個運行的所有循環,國家將無法正常更新數據。 的問題是如何實現它更好的,有可能是與承諾或異步的方式/等待也許更簡單的東西,這將使工作。根據需要放入隊列並等待狀態更新。看跌呼籲在隊列中,等待在React.js

簡化代碼是在這裏
分量孩子

this.props.data.forEach((item, i) => { 
    this.props.update(item); 
}); 

組件父

function update(data) { 
    let filtered = this.state.data.filter(item => item.uid !== data.uid); 
    this.setState({data: filtered}); 
} 
+0

能否請您解釋一下你正在試圖實現這種行爲是什麼?爲什麼不在運行循環之後更新狀態? –

+0

@DanielAndrei對不起,已經更新了的例子中,這樣的狀態下應與濾波的變量進行更新。 –

回答

2

如果我沒有理解好你需要的東西是這樣的:

update =() => { 
    let filtered = this.state.data.filter(x => this.props.data.every(y => x.uid !== y.uid)) 
    this.setState({ 
     data: filtered 
    }) 
} 
+0

謝謝,但它不起作用。 我需要等到狀態將被更新,然後在循環運行的下一個函數或我需要建立更新函數內部隊列中,等待每個過濾結果。因爲現在它只是重新保存已過濾的變量,並且只有循環中的最後一個函數才能正常工作。 –

+0

setState(updater,[callback])是一個異步函數。所以你可以檢查是否有更新回調的狀態: this.setState({ data:data },()=> { this.stateUpdated(); }); 另請選擇此項: https://facebook.github.io/react/docs/react-component.html#setstate –

+0

沒有機會回答,感謝您在此處發表評論。我沒有找到任何更好的解決方案,因爲只是使用setTimeout,因此在迭代器中放置了'''setTimeout((=)this.props.update(item))' –

2

爲什麼不通過遍歷您的數組在你的父組件?

兒童:

this.props.update(this.props.data); // pass the entire array 

家長:

function update(data) { 
    let filtered = data.map(d=> { 
     return this.state.data.filter(item => item.uid !== d.uid); 
    } 
    this.setState({data: filtered}); 
} 
+0

您必須稍微改變一下邏輯以適合您的需求。我不知道你到底在做什麼 – Nocebo

+0

我不能將數組傳遞給更新函數,因爲它只能接受一個對象。這是因爲它在全球範圍內使用,應該只能更新一個uid。 –