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

React JS授权表单isAuth状态不更新问题排查求助

问题排查与修复方案

1. 解决表单提交导致页面刷新的核心问题

你的按钮嵌套在<form>标签内,默认type为submit,点击后会触发表单提交行为,导致页面强制刷新——之前通过user.setIsAuth(true)和user.setUser(data)设置的状态会被重置为初始值(isAuth: false、user: {}),这是状态不生效的最直接原因。

修复:给按钮添加type="button"属性,阻止默认的表单提交:

<button type="button" onClick={() => click()} className='form__btn'>{isLogin ? 'Войти' : 'Регистрация'}</button>

2. 确认Context的Provider配置正确性

检查项目入口文件(如index.js)中Context的创建与Provider包裹是否正确,确保UserStore实例被全局注入:

// index.js 示例配置
import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom';
import { Context } from './index';
import UserStore from './UserStore';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <BrowserRouter>
    <Context.Provider value={{ user: new UserStore() }}>
      <App />
    </Context.Provider>
  </BrowserRouter>
);

若未用Context.Provider正确包裹App组件,useContext(Context)会拿到null,调用user.setUser或user.setIsAuth会直接报错,但你提到alert能触发,说明当前Provider配置大概率正常,可跳过此步验证。

3. 验证数据与实例有效性(可选排查)

在click函数中添加日志,确认user实例和接口返回数据的有效性:

const click = async() => {
    try {
        let data;
        if (isLogin) {
            data = await login(email, password);
        } else {
            data = await registration(email, password);
        }
        console.log('UserStore实例:', user); // 确认实例不为空
        console.log('接口返回用户数据:', data); // 确认解析后的JWT数据正常
        user.setUser(data);
        user.setIsAuth(true);
        console.log('更新后的isAuth:', user.isAuth); // 确认状态已更新
    } catch (e) {
        alert(e.response.data.message)
    }
}

如果日志显示状态已更新,但页面刷新后又重置,说明还是表单提交的问题未解决。

额外修正:userApi中的check函数错误

你的userApi.js里的check函数请求路径明显错误(指向了注册接口),后续做权限校验时会出问题,建议修正为正确的校验接口路径:

export const check = async () => {
    const response = await $authHost.get('api/user/check') // 改为正确的校验接口
    return jwt_decode(response.data.token)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:55:34