【问题标题】:initial state not updating on Dispatch初始状态未在 Dispatch 上更新
【发布时间】:2021-08-29 18:16:19
【问题描述】:

AuthReducer-reducer 文件

 const initialState = {
    isAuthenticated: false,
}
const authReducer = (state = initialState, action: any) => {
    switch (action.type) {
        case 'SIGN_IN':
            state = {
                ...state,
                isAuthenticated: true,
            }
            break;
        case 'SIGN_OUT':
            state = {
                ...state,
                isAuthenticated: false,
            }
            break;
        default:
            state = {
                isAuthenticated: false,
            }

    }
    return state;
}
export default authReducer;

调度员-调度动作

const authDispatch = useDispatch();
authDispatch({ type: 'SIGN_IN'});

商店

const rootReducer = combineReducers({
user: AuthReducer

}); 常量存储 = 创建存储( 根减速器, 撰写(应用中间件(thunk)) );

结果

{isAuthenticated: false}

我想要的结果

{isAuthenticated: true}

我该如何解决这个错误我无法解决这个错误,请帮助我...

【问题讨论】:

    标签: reactjs redux


    【解决方案1】:

    我认为应该是。你返回的状态不正确。

    switch (action.type) {
            case 'SIGN_IN':
               return {
                    ...state,
                    isAuthenticated: true,
                }
               
            case 'SIGN_OUT':
                return {
                    ...state,
                    isAuthenticated: false,
                }
               
            default:
               return {
                    ...state,
                    isAuthenticated: false,
                }
    
        }
    

    【讨论】:

    • 你也可以发布商店吗?
    • 你能检查一下你是否正确地获取了 action.type。如果在选择使用选择器时检查你需要获取 state.user.isAuthenticated
    • const rootReducer = combineReducers({ user: AuthReducer }); const store = createStore(rootReducer, compose(applyMiddleware(thunk)));
    • 最初得到 state.user.isAuthenticated 是返回 true 但页面刷新后,它休息为 false
    • 你的页面不应该刷新。如果刷新它会丢失数据。这就是 redux 的工作原理。它不是本地存储所以
    【解决方案2】:

    从您的 cmets 中读取,我可以确定您需要在刷新时保留 redux 数据。 Redux 值不会在刷新时保持不变,这就是 redux 的方式,如果您打算在刷新时保持值,则需要保持 Redux 状态。

    这可以通过一个 npm 包“redux-persist”来实现。 您可以点击此链接,文档描述性很强

    https://www.npmjs.com/package/redux-persist

    【讨论】:

      【解决方案3】:

      您的default case 设置为isAuthenticated: false - 并且default case 将被任何不是"SIGN_IN""SIGN_OUT" 的Redux action 触发。因此,一旦调度了另一个操作,它就会返回到isAuthenticated: false

      你应该有

        default:
          return state
      

      另外,请注意,您通常正在编写一种非常古老的 Redux 风格,我们不再推荐它,因为它需要大量的样板(现代 Redux 也不会发生这种情况)。您可能正在关注一个非常过时的教程。 如需最新教程,请参阅official Redux tutorial

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-08
        • 2020-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-15
        • 2019-09-20
        • 1970-01-01
        相关资源
        最近更新 更多