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

Next.js实现页面刷新后登出成功模态框持久化显示

问题描述

登出成功后需要让提示模态框在页面刷新后依然显示,直到用户点击关闭按钮。当前执行登出操作时页面会刷新,导致“登出成功”模态框直接消失。尝试过useEffect但用法有误。

解决方案

页面刷新后React组件的state会重置,所以需要用**本地存储(localStorage)**来持久化登出成功的状态,具体步骤:

  • 登出完成后,在localStorage中存入登出成功的标记
  • 组件挂载时,读取localStorage的标记,决定是否打开模态框
  • 关闭模态框时,清除localStorage中的标记
修改后的代码

SigninButton组件

"use client";
import "./signinbutton.css";
import { signIn, signOut, useSession } from "next-auth/react";
import Modal from "./Modal";
import React, { useState, useEffect } from "react";

import { AiOutlineUserAdd } from "react-icons/ai";
import { IoMdLogOut } from "react-icons/io";

const SigninButton = ({ darkMode }) => {
  const [isModalOpen, setIsModalOpen] = useState(false);
  const { data: session } = useSession();

  // 组件挂载时检查localStorage,决定是否打开模态框
  useEffect(() => {
    const shouldShowModal = localStorage.getItem("showSignoutModal") === "true";
    if (shouldShowModal) {
      setIsModalOpen(true);
    }
  }, []);

  // 登出函数:完成后在localStorage标记需要显示模态框
  function logOut() {
    signOut().then(() => {
      localStorage.setItem("showSignoutModal", "true");
      // signOut会触发页面刷新,此处setIsModalOpen不会生效,刷新后靠useEffect读取localStorage打开模态框
    });
  }

  // 关闭模态框:清除localStorage标记并关闭模态框
  function closeModal() {
    setIsModalOpen(false);
    localStorage.removeItem("showSignoutModal");
  }

  if (session && session.user) {
    return (
      <div>
        <button onClick={logOut} className="profile-button">
          <div className="logout-icon">
            <IoMdLogOut
              size={32}
              color={darkMode ? "#ef9726" : "#0099d8"}
            ></IoMdLogOut>
          </div>
        </button>
        <Modal show={isModalOpen} onClose={closeModal}>
          <h2>Successful Signout</h2>
        </Modal>
      </div>
    );
  }

  return (
    <button onClick={() => signIn()} className="profile-button">
      <div className="user-icon">
        <AiOutlineUserAdd
          size={34}
          color={darkMode ? "#ef9726" : "#0099d8"}
        ></AiOutlineUserAdd>
      </div>
    </button>
  );
};

export default SigninButton;

Modal组件(无需修改,保留原代码)

import React from "react";
import "./modal.css"; // 可单独创建CSS文件定义模态框样式

const Modal = ({ show, onClose, children }) => {
  if (!show) return null;

  return (
    <div className="modal-overlay">
      <div className="modal-content">
        {children}
        <button onClick={onClose}>Close</button>
      </div>
    </div>
  );
};

export default Modal;
关键说明
  • 由于signOut()会触发页面刷新,登出时直接设置setIsModalOpen(true)不会生效,必须依赖localStorage持久化状态
  • 组件挂载时通过useEffect读取localStorage,判断是否需要显示模态框
  • 关闭模态框时一定要清除localStorage的标记,避免下次进入页面时重复显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:42:18