React中如何从父组件打开Material-UI Dialog弹窗?
问题原因
你的自定义Modal组件是内部独立维护状态的非受控组件,没有读取父组件Card传入的open、onClose属性,所以父组件点击按钮修改的状态无法同步到内部的Dialog组件,功能自然不生效。
解决方案
只需要修改Modal.js的代码,把它改成受控组件,直接使用父组件传入的状态和控制方法即可,修改后的完整代码如下:
import React from 'react'; import { withStyles } from '@material-ui/core/styles'; import Button from '@material-ui/core/Button'; import Dialog from '@material-ui/core/Dialog'; import MuiDialogTitle from '@material-ui/core/DialogTitle'; import MuiDialogContent from '@material-ui/core/DialogContent'; import MuiDialogActions from '@material-ui/core/DialogActions'; import IconButton from '@material-ui/core/IconButton'; import CloseIcon from '@material-ui/icons/Close'; import Typography from '@material-ui/core/Typography'; const styles = (theme) => ({ root: { margin: 0, padding: theme.spacing(2), }, closeButton: { position: 'absolute', right: theme.spacing(1), top: theme.spacing(1), color: theme.palette.grey[500], }, }); const DialogTitle = withStyles(styles)((props) => { const { children, classes, onClose, ...other } = props; return ( <MuiDialogTitle disableTypography className={classes.root} {...other}> <Typography variant="h6">{children}</Typography> {onClose ? ( <IconButton aria-label="close" className={classes.closeButton} onClick={onClose}> <CloseIcon /> </IconButton> ) : null} </MuiDialogTitle> ); }); const DialogContent = withStyles((theme) => ({ root: { padding: theme.spacing(2), }, }))(MuiDialogContent); const DialogActions = withStyles((theme) => ({ root: { margin: 0, padding: theme.spacing(1), }, }))(MuiDialogActions); // 接收父组件传入的props export default function (props) { const { open, onClose } = props; return ( <div> <Dialog onClose={onClose} aria-labelledby="customized-dialog-title" open={open}> <DialogTitle id="customized-dialog-title" onClose={onClose}> Modal title </DialogTitle> <DialogContent dividers> <Typography gutterBottom> Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. </Typography> <Typography gutterBottom> Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. </Typography> <Typography gutterBottom> Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla. </Typography> </DialogContent> <DialogActions> <Button autoFocus onClick={onClose} color="primary"> Save changes </Button> </DialogActions> </Dialog> </div> ); }
Card.js的代码不需要做任何修改,修改完后点击信息按钮即可正常打开弹窗。
内容的提问来源于stack exchange,提问作者MicSt
相关产品推荐
相关产品推荐

