重定向后反应状态数据未准备好

Posted

技术标签:

【中文标题】重定向后反应状态数据未准备好【英文标题】:React state data not ready after redirect 【发布时间】:2020-03-23 21:27:21 【问题描述】:

我用 react 和 node 构建了一个登录/注册系统。

登录后,我调用了一个加载用户的 loadUser 方法。这工作得很好。但是一旦我在登录后重定向,该状态下的数据对我来说是不可用的。没有重定向它工作正常。用户加载并显示在我的状态。但是在重定向之后什么都没有出现。

登录组件:

const onSubmit = (e) => 
    e.preventDefault(); 
    login(email,password);
;

if(isAuthenticated && !isLoading)
    return  <Redirect to="/dashboard"/>
 

登录操作:

export const login = (email,password) => async dispatch => 
    const config = 
        headers : 
            'Content-Type' : 'application/json',
        
    ;

    const body = JSON.stringify(email,password);

    try 
        const res = await axios.post('/auth', body, config);
        dispatch(type : LOGIN_SUCCESS , payload:res.data);
        dispatch(loadUser());
     catch(err)
        const errors = err.response.data.errors;

        if(errors) 
            errors.forEach(error => 
                dispatch(setAlert(error.msg,'error'));
            )
        
        dispatch(type: LOGIN_FAIL);
    

;

我重定向到的页面:

从“反应”导入反应 从'react-redux'导入connect;

const Dashboard = (user) => 
    return (
        <div>
            <h1>user.name</h1>
        </div>
    )
;

const mapStateToProps = (state) => 
    return user : state.auth.user;
;

export default connect(mapStateToProps)(Dashboard);

正如您在登录操作中看到的那样,loadUser 方法已运行。为什么用户:当我重定向到仪表板时为空。但是没有重定向就可以了..

编辑:

import 
    REGISTER_SUCCESS,
    REGISTER_FAIL,
    LOAD_USER,
    AUTH_ERROR,
    LOGIN_SUCCESS,
    LOGIN_FAIL,
 from '../actions/types';

const initialState = 
    token : localStorage.getItem('token'),
    isAuthenticated : null,
    loading: true,
    user : null,
;

export default function(state = initialState , action) 
    const payload, type = action;

    switch (type) 
        case LOAD_USER:
            return 
                ...state, 
                isAuthenticated : true,
                loading: false,
                user: payload
            ; 

        case REGISTER_SUCCESS:
        case LOGIN_SUCCESS:
            console.log(payload.token)
            localStorage.setItem('token', payload.token);
            return 
                ...state,
                ...payload,
                isAuthenticated: true,
                loading:false
            ;

        case REGISTER_FAIL:
        case AUTH_ERROR:   
        case LOGIN_FAIL:  
            localStorage.removeItem('token');
            return 
                ...state,
                token: null,
                isAuthenticated:null,
                loading:false
            ;

        default:
            return state;
    


【问题讨论】:

你能添加你的减速器吗? @ocheriaf 我添加了减速器 你正在使用重定向就像刷新页面请查看这里reacttraining.com/react-router/web/api/Redirect 此外,当您调用 loadUser 操作时,您不会发送任何有效负载,因此reducer 删除状态中的用户属性,因为它返回一个用户等于未定义有效负载的状态 【参考方案1】:

所以该州的用户不能直接使用,所以我必须建立一个检查。

const Dashboard = (user) => 
    return (<div>
        <h1>user ? (<div>user.name</div>) : (<div>loading...</div>)</h1>
    </div>)

;

const mapStateToProps = (state) => 
    return user : state.auth.user;
;

它的作用是在 fe 毫秒内显示一条加载消息,然后它给我我的用户数据。

【讨论】:

以上是关于重定向后反应状态数据未准备好的主要内容,如果未能解决你的问题,请参考以下文章

在 axios 响应做出反应后,如何有条件地重定向到页面?

反应路由器 - 登录后重定向

反应路由器 - 登录后重定向

页面重定向后未保留 Vuex 状态

反应路由器 v4 重定向不起作用

使用 redux-saga 重定向反应路由器