這個例子有些勉強,但忍耐着我。說我有兩個函數作爲成員的陣營組成:正確處理多個順序狀態更新
var OrderApp = React.createClass({
getInitialState: function() {
return {
selectedOrders: {},
selectedLineItems: {}
};
},
setOrderSelected: function(order, newSelectedState) {
var mutation = {};
mutation[order.id] = {$set: newSelectedState};
var newSelectedOrders = React.addons(this.state.selectedOrders, mutation);
_.each(order.lineItems, function(lineItem) {
setLineItemSelected(lineItem, newSelectedState);
});
this.setState({selectedOrders: newSelectedOrders});
},
setLineItemSelected: function(lineItem, newSelectedState) {
var mutation = {};
mutation[lineItem.id] = {$set: newSelectedState};
var newSelectedLineItems = React.addons(this.state.selectedLineItems, mutation);
this.setState({seelctedLineItems: newSelectedLineItems});
}
});
在調用OrderApp.setOrderSelected(訂單,真)完成,只有最後LINEITEM選擇的狀態出現在我的組件的狀態已經改變。我猜這是因爲REACT爲配料對setState的電話,所以當我打電話:
var newSelectedLineItems = React.addons(this.state.selectedLineItems, mutation);
在第二功能
,我每次拿起原來的狀態,所以只有最後一次突變生效。
我應該收集父函數中的所有狀態突變,並且只調用一次setState?這對我來說有點笨拙,我想知道我是否錯過了一個更簡單的解決方案。
作爲React的全新產品,我沒有考慮過在這裏使用Mixin,但是這絕對讓人感覺更清爽。我的一個問題涉及在您的解決方案中調用process.nextTick。我能找到的唯一文檔表明這是一個Node特定的庫。是否有類似的庫可用於在客戶端上處理時緩衝更新? – tnorwood 2014-10-03 19:16:38
如果你不使用browserify/webpack,你可以下載一個獨立的shim:http://wzrd.in/standalone/process%2fbrowser - 大多數人使用cjs模塊,你必須自己編譯一些庫,因爲npm通常是唯一的分銷渠道。 – FakeRainBrigand 2014-10-03 23:12:45
我真的很喜歡你對我問題的回答。我將Mike的答案標記爲僅僅因爲它不需要外部依賴。我認爲有一個強有力的案例可以讓你的答案從更多的ReactJS思維模式中解決問題。謝謝您的幫助。 – tnorwood 2014-10-06 13:19:55