Material UI Dialog 从内部组件关闭对话框

Material UI Dialog close dialog from inner component

我有一个使用 material ui 创建的登录对话框,但我使用单独的组件作为登录按钮。

单击按钮时如何关闭对话框?我想关闭对话框的是 SigninForm 组件中的提交按钮。我使用了 material ui 示例中的代码,但我提取了一些代码并使用了我自己的组件,因为我想要 SigninForm 内的按钮,因为我在 SigninForm 和 SignupForm 之间交换了表单。

应用程序:

function App() {
    return (
        <AppContainer>
            <SampleDialogueDemo />
        </AppContainer>
    );
}

示例对话:

function SampleDialogue(props) {
    const { onClose, selectedValue, open } = props;

    const handleClose = () => {
        onClose(selectedValue);
    };

    return (
        <Dialog onClose={handleClose} open={open}>
            <AccountBox />
        </Dialog>
    );
}

SampleDialogue.propTypes = {
    onClose: PropTypes.func.isRequired,
    open: PropTypes.bool.isRequired,
};

export default function SampleDialogueDemo(props) {
    const [open, setOpen] = useState(false);

    const handleClickOpen = () => {
        setOpen(true);
    };

    const handleClose = () => {
        setOpen(false);
    };

    return (
        <div>
            <button onClick={handleClickOpen}>Click Me</button>
            <SampleDialogue onClose={handleClose} open={open} />
        </div>
    );
}

帐号框:

export function AccountBox() {
    const [isExpanded, setExpanded] = useState(false);
    const [active, setActive] = useState('signin');

    const playExpandingAnimation = () => {
        setExpanded(true);
        setTimeout(() => {
                setExpanded(false);
            },
            expandedTransition.duration * 1000 - 1500);
    };

    const switchToSignup = () => {
        playExpandingAnimation();
        setTimeout(() => {
            setActive('signup');
        }, 400);
    };

    const switchToSignin = () => {
        playExpandingAnimation();
        setTimeout(() => {
            setActive('signin');
        }, 400);
    };

    const contextValue = { switchToSignup, switchToSignin };

    return (
        <AccountContext.Provider value={contextValue}>
            <BoxContainer>
                <TopContainer>
                    <BackDrop initial={false}
                              animate={isExpanded ? 'expanded' : 'collapsed'}
                              variants={backdropVariants}
                              transition={expandedTransition} />
                    {active === 'signin' &&
                    <HeaderContainer>
                        <HeaderText>Create</HeaderText>
                        <HeaderText>Account</HeaderText>
                        <SmallText>Please sign-up to continue!</SmallText>
                    </HeaderContainer>
                    }
                    {active === 'signup' &&
                    <HeaderContainer>
                        <HeaderText>Welcome</HeaderText>
                        <HeaderText>Back</HeaderText>
                        <SmallText>Please sign-in to continue!</SmallText>
                    </HeaderContainer>
                    }
                </TopContainer>
                <InnerContainer>
                    {active === 'signin' && <SigninForm />}
                    {active === 'signup' && <SignupForm />}
                </InnerContainer>
            </BoxContainer>
        </AccountContext.Provider>
    );
}

登录表单:

export function SigninForm() {
    const { switchToSignup } = useContext(AccountContext);

    return <BoxContainer>
        <Marginer direction={'vertical'} margin={15} />
        <FormContainer>
            <Input type={'email'} placeholder={'Email'} />
            <Input type={'password'} placeholder={'Password'} />
            <Marginer direction={'vertical'} margin={10} />
            <MutedLink href={'#'}>Forgot Password?</MutedLink>
            <Marginer direction={'vertical'} margin={'1.6em'} />
------->    <Submit type={'submit' onClick={CLOSE DIALOG HERE}>Sign In</Submit>
            <Marginer direction={'vertical'} margin={'1em'} />
            <MutedLink href={'#'}>
                Don't have an account?
                <BoldLink href={'#'} onClick={switchToSignup}>Sign Up</BoldLink>
            </MutedLink>
        </FormContainer>
    </BoxContainer>;
}

好的,我开始工作了。我必须添加

 const {handleClose} = props

在我的 AccountBox 函数中然后更改

{active === 'signin' && <SigninForm  />}

{active === 'signin' && <SigninForm onClick={handleClose} />}

然后我可以从 SigninForm 关闭它。

您需要使用道具来发送处理程序。

 <AccountBox handleClose = {handleClose}/>

在 AccountBox 元素之后

on function:
const someAction = () =>{
   handleClose();
}

on Components: 
<Button onClick={handleClose}>Text</Button>

-- or --
<Button onClick={()=>{handleClose();}>Text</Button>

您的组件“SampleDialog”似乎需要第三个道具 - selectedValue - 您的 PropTypes 中遗漏了它。你可以从你的组件中删除那个道具,而不是调用你的“onClose”函数

const handleClose = () => {
        onClose();
};