2017-07-06 29 views
2

我在我的React表單中使用了受控組件。我關心的是那些用戶可以輸入長文本的輸入字段。關於受控組件的內存使用問題

因爲我使用Redux進行狀態管理,狀態是不可變的。所以,在描述字段,如果我要輸入「!一些介紹」,即保存在我的終極版店內的狀態值是:

S 
So 
Som 
Some 
Some 
Some d 
Some de 
[and so on] 

在用戶會話的續航時間,內存使用量有點沉重,只是存儲這些表單域的所有以前的狀態。這特別涉及系統資源有限的移動設備。

管理我的redux商店的內存消耗有什麼好的策略?有沒有辦法清除商店的某些部分?我不想消除一切,但如果某些部分能夠以受控方式刷新,這將是有益的。

+0

你是說Redux保持當前值之外的所有以前的值,或者你有代碼嗎? –

+0

低懸的水果會給'onChange'事件增加一個反彈。不理想,但可以幫助,如果沒有像你正在尋找的某種垃圾收集器。 –

+0

在這些情況下,您可以在調用動作之前使用'setTimeout',這樣每次用戶按下某個字符時都不必調用動作。我給出了一個答案的例子。 – Manolo

回答

2

您誤解了Redux的工作原理以及不可變的數據更新是如何工作的。 Redux不會在默認情況下保留狀態樹的先前版本或操作。 Redux DevTools確實跟蹤以前的特定數量的行爲和結果狀態樹,但僅限於開發中。任何不再被引用的對象都將被JS垃圾收集器清理。

請參閱http://redux.js.org/docs/faq/Performance.html#performance-state-memoryIs there any way to "commit" the state in Redux to free memory?ngredux state with big data collection, memory concerns瞭解更多信息。

+0

這是有啓發性的,雖然有點困惑。如果我使用'Object.assign',這樣我就不會改變狀態,以前的狀態是否被刪除,只有當前狀態保留? – Sam

+1

Redux將不再具有其'currentState'變量指向根狀態樹對象,因此將得到GC'd(假定應用程序的其他部分不引用它)。舊狀態樹中新狀態樹不重用的任何部分也將獲得GC'd。 – markerikson