首页 > 解决方案 > 在 API 调用之前进行 React 渲染

问题描述

所以我对服务器进行 API 调用以获取 currentUser,

useEffect(() => {
    loadUser()
},[])

由于 React 的行为类似于render first run lifecycle methods second,起初,我的用户选择器返回 null ,这是我所期望的。

但是我仍然有user is null错误,所以这是我的代码 =>

const isAuthenticated = useSelector(state => state.auth.isAuthenticated)
const user = useSelector(state => state.auth.user)

const authLinks = (
    <nav className="auth-navbar">
        <div className="auth-navbar__dropdown">
            <button type="button" className="dropdown-btn" onClick={dropdown}><img src={profilephoto}></img></button>
            <div className="dropdown-menu">
                <Link to={`u/${user.username}`} className="dropdown-link">Profile</Link>
                <Link to="/settings" className="dropdown-link">Settings</Link>
                <Link to="/" onClick={onClickHandler} className="dropdown-link">Logout</Link>
            </div>
        </div>
    </nav>
)
if (user) {
    return (
        <header className="header">
            <Link to="/" className="logo" >
                <img src={logo} alt="logo"/>
            </Link>
            {isAuthenticated ? authLinks : guestLinks}
        </header>
    )
} else {
    return <p>loading..</p>
}

之前在 stackoverflow 上已经提出过这样的问题,但解决方案与我的类似,但它仍然不起作用。请帮我。

PS:默认usernull在reducer中。

编辑:加载用户的动作创建者 =>

export const loadUser = () => (dispatch) => {

    dispatch({ type: USER_LOADING })

    const config = {
        withCredentials: true
    }

    axios.get('http://127.0.0.1:8000/auth/user/', config)
        .then(res => {
            dispatch({
                type: USER_LOADED,
                payload: res.data
            })
        }).catch(err => {
            console.log(err)
            dispatch({
                type: AUTH_ERROR
            })
        })
}

通常用户加载没有错误=>

用户

减速机 =>

const initialState = {
    isAuthenticated: false,
    isLoading: false,
    user: null,
}
export default function(state=initialState, action){
    switch(action.type){
        case USER_LOADING:
            return {
                ...state,
                isLoading: true
            }
        case USER_LOADED:
            return {
                ...state,
                isAuthenticated: true,
                isLoading: false,
                user: action.payload
            } 

标签: javascriptreactjs

解决方案


我认为您需要创建一个仅在存在authLinks时才执行并返回相关 JSX 的函数。实际上,变量将在初始化之前user尝试访问该属性。user.username

const authLinks = () => (
  ...
);

然后在返回中调用它。

{isAuthenticated ? authLinks() : guestLinks}

推荐阅读