You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native登录后无法自动跳转至授权页面问题排查

React Native 登录后未自动跳转授权页面的解决方案

问题根源

你的useAuth Hook仅在组件初始化时执行一次fetchData获取Token,登录成功保存Token后,没有触发重新获取Token的逻辑,导致userToken/adminToken状态未更新,路由组件无法感知Token变化,因此不会自动切换到授权页面。


具体修复步骤

1. 更新authUtils.ts,添加手动刷新Token的方法

修改useAuth,暴露refreshAuth方法用于登录成功后触发Token重新获取,同时优化状态互斥逻辑:

import { useEffect, useState } from "react";
import { getUserToken, getAdminToken } from "./localService";

export const useAuth = () => {
  const [isLoading, setIsLoading] = useState(true);
  const [userToken, setUserToken] = useState<string | null>(null);
  const [adminToken, setAdminToken] = useState<string | null>(null);

  const fetchData = async () => {
    try {
      const adminToken = await getAdminToken();
      if (adminToken) {
        setAdminToken(adminToken);
        setUserToken(null); // 确保管理员/用户Token互斥
      } else {
        const userToken = await getUserToken();
        setUserToken(userToken);
        setAdminToken(null);
      }
    } catch (error) {
      console.log("Error while fetching data:", error);
    } finally {
      setIsLoading(false);
    }
  };

  // 暴露刷新方法,供登录组件调用
  const refreshAuth = async () => {
    setIsLoading(true);
    await fetchData();
  };

  useEffect(() => {
    fetchData();
  }, []);

  return { isLoading, userToken, adminToken, refreshAuth };
};

2. 在登录组件中调用refreshAuth

以管理员登录组件AdminLogin为例,在保存Token成功后调用refreshAuth更新状态:

import { useAuth } from "../../services/authUtils";
import { saveAdminToken } from "../../services/localService";

const AdminLogin = () => {
  const { refreshAuth } = useAuth();

  const handleLogin = async () => {
    // 这里替换为你的登录请求逻辑
    const loginResponse = await apiAdminLogin(/* 账号密码等参数 */);
    await saveAdminToken(loginResponse.token);
    
    // 登录成功后触发状态刷新
    await refreshAuth();
  };

  return (
    // 登录UI代码
  );
};

用户登录组件UserLogin同理,调用saveUserToken后执行refreshAuth即可。

3. 修复localService.ts的冗余判断

React Native环境中不存在window对象,删除getUserToken中的无效判断:

export const getUserToken = async () => {
  try {
    const token = await AsyncStorage.getItem("user");
    return token ?? null;
  } catch (error) {
    console.log("Error while retrieving user token:", error);
    return null;
  }
};

为什么之前的尝试无效?

你之前在登录函数中调用获取Token的方法,仅能拿到Token值,但没有更新useAuth Hook中的状态变量。React组件只有在状态或Props变化时才会重新渲染,必须通过refreshAuth触发状态更新,才能让路由组件感知到Token变化并自动切换页面。

内容的提问来源于stack exchange,提问作者greatkene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:16:03