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中的数据是一个副作用。