如何阻止用户执行sign out登出操作时sign in dialog弹窗自动弹出
问题原因
你遇到的问题核心是弹窗的open状态在登录成功后没有被重置,状态残留触发登出后自动弹出:
- 未登录时点击SIGN IN按钮,
open被设为true,弹窗正常触发 - 登录成功后
currentUser变为有效值,承载弹窗的未登录分支直接卸载,但open状态定义在Header组件内部,Header本身没有卸载,所以open仍保留为true - 用户登出后
currentUser变回空值,未登录分支重新渲染,弹窗读取到残留的open=true就自动弹出
解决方法
新增useEffect监听currentUser变化,登录成功后自动重置弹窗状态为关闭即可,修改后的完整代码如下:
import { useState, useEffect } from 'react'; // 确保已导入useEffect const Header = ({ currentUser, hidden, signOutStart }) => { const [open, setOpen] = useState(false); // 新增逻辑:登录成功后自动关闭弹窗、重置状态 useEffect(() => { if (currentUser) { setOpen(false); } }, [currentUser]) const handleClickOpen = () => { setOpen(true); }; const handleClose = () => { setOpen(false); }; return ( <sc.HeaderContainer> <sc.LogoContainer to={'/'}> <Logo className={'logo'} /> </sc.LogoContainer> <sc.OptionsContainer> <sc.OptionLink to={'/shop'}>SHOP</sc.OptionLink> <sc.OptionLink to={'/contact'}>CONTACT</sc.OptionLink> {currentUser ? ( <sc.OptionLink as={'div'} to={'/#'} onClick={signOutStart}> SIGN OUT </sc.OptionLink> ) : ( <sc.OptionsContainer> <sc.OptionLink onClick={handleClickOpen} to={'/#'}>SIGN IN</sc.OptionLink> <SignInSignUpDialogue onClose={handleClose} open={open} /> </sc.OptionsContainer> )} <CartIcon /> </sc.OptionsContainer> {hidden ? null : <CartDropdownContainer />} </sc.HeaderContainer> ); }; const mapStateToProps = createStructuredSelector({ currentUser: selectCurrentUser, hidden: selectCartHidden, }); const mapDispatchToProps = dispatch => ({ signOutStart: () => dispatch(signOutStart()), }); export default connect(mapStateToProps, mapDispatchToProps)(Header);
可选优化
你也可以把SignInSignUpDialogue组件移到条件判断分支的外层,不嵌套在未登录逻辑内,避免分支切换带来的状态关联问题,逻辑会更清晰。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

