从 react-redux 迁移到 redux-toolkit 后使用 configureStore 传递初始状态的最佳方法

Posted

技术标签:

【中文标题】从 react-redux 迁移到 redux-toolkit 后使用 configureStore 传递初始状态的最佳方法【英文标题】:the best way to pass initial state with configureStore after migration from react-redux to redux-toolkit 【发布时间】:2021-11-17 07:55:59 【问题描述】:

场景是当用户登录时,我将他的用户信息存储在本地存储中,以避免在我刷新页面时丢失会话, 这是我之前在 Store.js 中使用 react-redux 的代码

// import

const reducer = combineReducers(
  userLogin: userLoginReducer,
  userRegister: userRegisterReducer,
  // more reducers
)

const userInfoFromStorage = localStorage.getItem("userInfo")
  ? JSON.parse(localStorage.getItem("userInfo"))
  : null

const initialState = 
  userLogin:  userInfo: userInfoFromStorage ,


const middleware = [thunk]

const store = createStore(
  reducer,
  initialState,  // i used to pass initial state (with userInfo in it) whith createStore
  composeWithDevTools(applyMiddleware(...middleware))
)

export default store

这段代码曾经很适合我,当我刷新页面时,我不会失去我的会话

现在我正在尝试迁移到 redux-toolkit(我不会更改我的旧减速器,我将使用新的代码方式使用 createSlice 仅与新的)

// import

const userInfoFromStorage = localStorage.getItem("userInfo")
  ? JSON.parse(localStorage.getItem("userInfo"))
  : null

const initialState = 
  userLogin:  userInfo: userInfoFromStorage ,


const store = configureStore(
  reducer: 
    userLogin: userLoginReducer,
    userRegister: userRegisterReducer,
    userDetails: userDetailsReducer,
    // more reducers
  ,
  initialState, // i don't know if this way is correct to add initial state to configureStore, it doesn't work
)

export default store

configureStore 在我的应用中与所有 reducer 一起运行良好

除了我无法将 userInfo 从 localstorage 传递到 userLogin 的 initialState 以保持填充以避免在刷新页面时丢失会话 (注意:在我的组件中,我检查 userLogin 中是否有任何数据?如果为真,则没有任何反应:如果将假用户发送到登录页面

【问题讨论】:

有人帮忙吗? 【参考方案1】:

您添加preloadedState 属性:

// import

const userInfoFromStorage = localStorage.getItem("userInfo")
  ? JSON.parse(localStorage.getItem("userInfo"))
  : null

const initialState = 
  userLogin:  userInfo: userInfoFromStorage ,


const store = configureStore(
  reducer: 
    userLogin: userLoginReducer,
    userRegister: userRegisterReducer,
    userDetails: userDetailsReducer,
    // more reducers
  ,
  preloadedState: initialState,
)

export default store

【讨论】:

【参考方案2】:

我不确定您是否可以将初始状态设置为 configureStore() 中的第二个参数。但是,您可以使用初始状态和 reducers(action.type) 创建一个 createSlice() 方法。

const initialState = 
  userLogin:  userInfo: userInfoFromStorage ,

设置初始状态后,您可以:

const userInfoSlice = createSlice(
      name: "userInfo",
      initialState: initialState,
      reducers: 
         yourReducerFunction() 
             //You can manipulate the state in here 
           
        ,
      ,
    );

然后您可以简单地将它们包含在配置存储中。确保它们的键名为 reducer,并在 createSlice 变量末尾包含 .reducer。

const store = configureStore(
  reducer: counterSlice.reducer,
);

【讨论】:

以上是关于从 react-redux 迁移到 redux-toolkit 后使用 configureStore 传递初始状态的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

react-redux状态管理器

如何使用passport-facebook身份验证重定向到用户登录react-redux应用程序的页面?

useSelector 无法从“react-redux”导出

react-redux,使用一个操作从两个输入字段中更改对象键/值

React-Redux 中的倒数计时器功能

无法从“node_modules\react-redux\lib\index.js”解析“./utils/batch”