Javascript 您可以或者应该在Redux';什么是初始状态?
例如Javascript 您可以或者应该在Redux';什么是初始状态?,javascript,reactjs,ecmascript-6,redux,flux,Javascript,Reactjs,Ecmascript 6,Redux,Flux,例如 export const user = (state = { id: localStorage.getItem('id'), name: localStorage.getItem('name'), loggedInAt: null }, action) => { case types.LOGIN: localStorage.setItem('name', action.payload.user.name); localStorage.set
export const user = (state = {
id: localStorage.getItem('id'),
name: localStorage.getItem('name'),
loggedInAt: null
}, action) => {
case types.LOGIN:
localStorage.setItem('name', action.payload.user.name);
localStorage.setItem('id', action.payload.user.id);
return { ...state, ...action.payload.user }
default:
return { ...state, loggedInAt: Date.now() }
}
这是我正在做的事情的缩小版本,默认情况下会按预期从localStorage返回状态。然而,一旦我刷新页面,我的应用程序的状态实际上是空白的 Redux第二个参数用于商店初始化:
createStore(reducer, [initialState], [enhancer])
所以你可以这样做:
const initialState = {
id: localStorage.getItem('id'),
name: localStorage.getItem('name'),
loggedInAt: null
};
const store = createStore(mainReducer, initialState);
由于缩减器应该是纯函数(即没有副作用)并且localStorage.setItem
是副作用,因此应该避免在缩减器中保存到localStorage
相反,您可以:
store.subscribe(() => {
const { id, name } = store.getState();
localStorage.setItem('name', name);
localStorage.setItem('id', id);
});
这种情况会在状态更改时发生,因此可能会影响性能
另一个选项是仅当页面关闭时(刷新计数),使用onbeforeuload
:
window.onbeforeunload = () => {
const { id, name } = store.getState();
localStorage.setItem('name', name);
localStorage.setItem('id', id);
};
你应该这样做是什么意思??取决于您的应用程序需要。@AvraamMavridis if在某种程度上感觉是一种不好的做法。可能的重复和另一种选择是使用类似于PockDB和couchDB的中间件来帮助保持存储无状态。在action creators中写入localstorage如何?他们被允许有副作用。另外,正在通过
localstorage.getItem
读取以加载reducer参数中的初始状态,因为OP描述了一个副作用?您可以使用localstorage in action creators进行粒度状态保存。虽然我仍然喜欢一个可以调谐的中央保存状态。Reducer应该是纯函数,在函数体中添加localStorage中的数据是一个副作用。