为什么已登录情况下我从首页输入/login可以正常跳转到我的问卷页,但是中间会闪烁出现登录或者注销页面

来源:12-21 根据用户登录状态动态跳转页面-使用自定义Hook统一处理

qq_暖若安阳_9

2024-10-06

为什么已登录情况下我从首页输入/login可以正常跳转到我的问卷页,但是中间会闪烁出现登录或者注销页面。我看老师这块没有这个问题,找了半天不知道什么情况导致的?
useNavigatePage 代码:

import { useEffect } from 'react';

import useGetUserInfo from './useGetUserInfo';

import { useLocation, useNavigate } from 'react-router-dom';

import {

  isLoginOrRegisterPage,

  isNotNeedLoginPage,

  LOGIN_PATHNAME,

  MANAGE_INDEX_PATHNAME,

} from '../router';


function useNavigatePage(waitUserData: boolean) {

  const { username } = useGetUserInfo();

  const { pathname } = useLocation();

  const navigate = useNavigate();


  useEffect(() => {

    if (waitUserData) return;


    // 已经登录了

    if (username) {

      // 登录或注册页,跳转到我的问卷页

      if (isLoginOrRegisterPage(pathname)) {

        navigate(MANAGE_INDEX_PATHNAME);

      }

      return;

    }

    // 未登录

    if (isNotNeedLoginPage(pathname)) {

      return;

    } else {

      navigate(LOGIN_PATHNAME);

    }

  }, [waitUserData, username, pathname]);

}

export default useNavigatePage;

MainLayout 代码如下:

import React, { FC } from 'react';

import { Outlet } from 'react-router-dom';

import { Layout, Spin } from 'antd';

import styles from './MainLayout.module.scss';

import Logo from '../components/Logo';

import UserInfo from '../components/UserInfo';

import useLoadUserData from '../hooks/useLoadUserData';

import useNavigatePage from '../hooks/useNavigatePage';


const { Header, Footer, Content } = Layout;


const MainLayout: FC = () => {

  const { loading: waitUserData } = useLoadUserData();

  useNavigatePage(waitUserData);

  return (

    <Layout>

      <Header className={styles.header}>

        <div className={styles.left}>

          <Logo />

        </div>

        <div className={styles.right}>

          <UserInfo></UserInfo>

        </div>

      </Header>

      <Content className={styles.main}>

        {waitUserData ? (

          <div style={{ textAlign: 'center' }}>

            <Spin />

          </div>

        ) : (

          <Outlet />

        )}

      </Content>

      <Footer className={styles.footer}>小慕问卷 &copy;2024-Created by Ryan</Footer>

    </Layout>

  );

};

export default MainLayout;

useLoadUserData 代码如下:


import { useRequest } from 'ahooks';

import { getUserInfoHttp } from '../services/user';

import { useDispatch } from 'react-redux';

import { loginReducer } from '../store/userSlice';

import useGetUserInfo from './useGetUserInfo';

import { useEffect, useState } from 'react';


function useLoadUserData() {

  const [loading, setLoading] = useState(true);

  const dispatch = useDispatch();

  // 手动执行请求

  const { run: getUserInfo } = useRequest(getUserInfoHttp, {

    manual: true,

    onSuccess(result) {

      const { username, nickname } = result;

      // 派发action,更新userInfo,存储到redux中

      dispatch(loginReducer({ username, nickname }));

    },

    onFinally() {

      // 无论请求成功失败,最终设置loading为false

      setLoading(false);

    },

  });

  // 判断当前redux store中是否已经存储了用户信息

  const { username } = useGetUserInfo();

  useEffect(() => {

    if (username) {

      setLoading(false);  // 如果redux中存在用户信息,则不重新加载请求

      return;

    }

    getUserInfo(); 

  }, [username]);

  return { loading };

}

export default useLoadUserData;


写回答

1回答

双越

2024-10-07

这个问题需要一步一步调试,首先,你要找出,是哪一行代码让你跳转到登录/注销页的?

跳转登录/注销页的代码就那么多,你挨个 debug 肯定能找到。

只要找到了这个,接下来就好排查了

0
0

React18+ Nest.js 全栈开发仿问卷星项目

React18+TS4+Antd5+Next.js13 ,B端+C 端,完整业务

395 学习 · 290 问题

查看课程