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

React登录模态框仅能打开一次的问题求助

解决React登录模态框仅能唤起一次的问题

你的问题核心在于模态框关闭时未同步更新父组件状态:当点击关闭按钮时,子组件SignInModal仅修改了本地的isOpen状态,但父组件的showSignInModal仍保持为true。后续再次点击登录按钮时,父组件执行setShowSignInModal(true),但由于状态值未发生变化(原本就是true),子组件的useEffect不会触发,导致isOpen仍为false,模态框无法再次打开。

修复方案

步骤1:给子组件添加状态回调Props

修改SignInModal组件,接收父组件传递的回调函数,在关闭模态框时同步更新父组件状态:

import { Modal } from "components/Modal";
import React, { useState, useEffect } from "react";

// 定义Props类型,替代any提升类型安全
interface SignInModalProps {
  showSignInModal: boolean;
  onClose: () => void;
}

export default function SignInModal(props: SignInModalProps) {
  const { showSignInModal, onClose } = props;
  const [isOpen, setIsOpen] = useState(showSignInModal);

  useEffect(() => {
    setIsOpen(showSignInModal);
  }, [showSignInModal]);

  return (
    <div>
      <Modal
        isOpen={isOpen}
        onDismiss={() => {
          setIsOpen(false);
          // 调用父组件回调,同步更新父组件状态
          onClose();
        }}
        title=""
      >
        <div className="text-white">Hello World</div>
      </Modal>
    </div>
  );
}

步骤2:在父组件中传递回调函数

修改index.js代码,给SignInModal传递关闭回调,重置父组件的showSignInModal状态:

const [showSignInModal, setShowSignInModal] = useState(false);

function handleOpenConnect() {
  setShowSignInModal(true);
}

// 新增关闭模态框的回调函数
function handleCloseSignInModal() {
  setShowSignInModal(false);
}

return (
  <>
    <Button onClick={handleOpenConnect}>
      Sign In
    </Button>
    <SignInModal 
      showSignInModal={showSignInModal} 
      onClose={handleCloseSignInModal}
    />
  </>
);

可选优化:移除子组件本地状态

你可以直接使用父组件传递的showSignInModal作为模态框的isOpen值,彻底避免状态不同步问题:

import { Modal } from "components/Modal";
import React from "react";

interface SignInModalProps {
  showSignInModal: boolean;
  onClose: () => void;
}

export default function SignInModal(props: SignInModalProps) {
  const { showSignInModal, onClose } = props;

  return (
    <div>
      <Modal
        isOpen={showSignInModal}
        onDismiss={onClose}
        title=""
      >
        <div className="text-white">Hello World</div>
      </Modal>
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:03:21