我想將我的狀態樹的某些部分保存到localStorage。什麼是適當的地方這樣做?還原劑還是行動?在Redux應用程序中寫入localStorage的位置?
回答
減速機永遠不是合適的地方,因爲減速機應該是純淨的,沒有副作用。
我會建議只是在做它在用戶:
store.subscribe(() => {
// persist your state
})
之前創建存儲,讀取那些堅持部分:
const persistedState = // ...
const store = createStore(reducer, persistedState)
如果使用combineReducers()
你會發現,這減速器避風港收到的狀態將使用默認值state
的參數值「正常啓動」。這可以非常方便。
建議您消除訂閱者的注意力,以免寫入localStorage的速度過快,否則會出現性能問題。
最後,您可以創建一箇中間件,將其作爲替代方案進行封裝,但我會先從訂閱者開始,因爲它是一個更簡單的解決方案,並且可以很好地完成這項工作。
與此同時Redux的存儲似乎也被拋棄。 – Dani
要在丹·阿布拉莫夫的回答填補空白,你可以使用store.subscribe()
這樣的:
store.subscribe(()=>{
localStorage.setItem('reduxState', JSON.stringify(store.getState()))
})
創建商店之前,檢查localStorage
和你的鑰匙像這樣在解析任何JSON:
const persistedState = localStorage.getItem('reduxState') ? JSON.parse(localStorage.getItem('reduxState')) : {}
然後您將此peristedState
常數傳遞給您的createStore
這樣的方法:
const store = createStore(
reducer,
persistedState,
/* any middleware... */
)
簡單而有效,無需額外依賴。 – AxeEffect
創建一箇中間件可能看起來好一點,但我同意它是有效的,並且足以在大多數情況下 –
使用combineReducers時是否有一個很好的方法來執行此操作,並且您只需要堅持一個存儲? – brendangibson
如果有人對上述有任何問題,你可以寫你自己的。讓我告訴你我做了什麼。忽略saga middleware
的事情只關注兩件事localStorageMiddleware
和reHydrateStore
方法。該localStorageMiddleware
把所有的redux state
,並把它放在local storage
和rehydrateStore
把所有的applicationState
在本地存儲中如果存在的話,並把它放在redux store
import {createStore, applyMiddleware} from 'redux'
import createSagaMiddleware from 'redux-saga';
import decoristReducers from '../reducers/decorist_reducer'
import sagas from '../sagas/sagas';
const sagaMiddleware = createSagaMiddleware();
/**
* Add all the state in local storage
* @param getState
* @returns {function(*): function(*=)}
*/
const localStorageMiddleware = ({getState}) => { // <--- FOCUS HERE
return (next) => (action) => {
const result = next(action);
localStorage.setItem('applicationState', JSON.stringify(
getState()
));
return result;
};
};
const reHydrateStore =() => { // <-- FOCUS HERE
if (localStorage.getItem('applicationState') !== null) {
return JSON.parse(localStorage.getItem('applicationState')) // re-hydrate the store
}
}
const store = createStore(
decoristReducers,
reHydrateStore(),// <-- FOCUS HERE
applyMiddleware(
sagaMiddleware,
localStorageMiddleware,// <-- FOCUS HERE
)
)
sagaMiddleware.run(sagas);
export default store;
- 1. 在iOS應用程序中訪問localStorage
- 2. 訪問/寫入Chrome應用localStorage的
- 3. 「printf」在Windows非控制檯應用程序中寫入的位置?
- 4. LocalStorage與react-redux
- 5. 在apollo-react-redux應用程序中使用redux-form值得嗎?
- 6. 插入符號的位置/位置在任何應用程序中
- 7. 嵌入資源存儲在.NET應用程序中的位置?
- 8. 使用localStorage保存可排序div的位置/位置
- 9. 在react.js中將redux-form與redux-sagas集成應用程序
- 10. Building React/Redux應用程序
- 11. React redux子應用程序
- 12. Android - 在我的應用程序中的位置監聽程序
- 13. 用localStorage做的應用程序
- 14. 應用程序的位置在哪裏?
- 15. 在Android上的位置應用程序
- 16. 在非GDI應用程序中獲取插入位置
- 17. Doodlz應用程序位置?
- 18. Android位置應用程序
- 19. PhoneGap的應用程序和localStorage的
- 20. 是否可以在localStorage上存儲PhoneGapp應用程序設置?
- 21. Angularjs localStorage存儲設置在科爾多瓦應用程序
- 22. 在一個反應性的js/redux應用程序中設置默認狀態
- 23. UIToolbar在應用程序進入前臺後的位置更改
- 24. 在Scala Play-Framework中寫入localStorage?
- 25. Swingbuilder - 應用程序位置居中
- 26. 在C#應用程序處置位
- 27. 在Laravel應用程序中指定應用程序版本的位置?
- 28. 將應用程序邏輯放在Thruway應用程序中的位置?
- 29. 如何在Dart應用程序中應用Redux概念?
- 30. 將應用程序設置放在JSF中的位置
如果我想訂閱只是國家的一部分?那可能嗎?我繼續做一些有點不同的事情:1.在redux之外保存持久狀態。 2.使用redux動作加載反應構造函數(或componentWillMount)中的持久狀態。 2是完全正確的,而不是直接在商店中加載持久數據? (我試圖單獨保存SSR)。順便謝謝Redux!這是真棒,我喜歡它,在我的大項目代碼迷路後,現在回到簡單和可預測的:) –
在店內。訂閱回撥,您可以完全訪問當前的商店數據,因此您可以保留您感興趣的任何部分 –
Dan Abramov也製作了一個完整的視頻: https://egghead.io/lessons/javascript-redux-持久化狀態到本地存儲 – NateW