javascript - 如何从父组件打开 Material-UI 对话框 - React?
问题描述
我知道已经有一些关于堆栈溢出的问题,但我一直在尝试使用他们的答案但没有成功;所以我在这里发布我的代码,就像在我尝试不起作用的解决方案之前一样。在使用类似方法但在使用 Material-UI 时遇到问题之前,我已经能够使用 ant-design 从父组件打开一个模式。
我已经将我的模态(material-ui 对话框)导入到我的父卡组件中,我已经有一个信息图标按钮,我想用它来打开模态(material-ui 对话框)。我没有收到任何错误,但是它不起作用,代码如下。
模态.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);
export default function () {
const [open, setOpen] = React.useState(false);
const handleClickOpen = () => {
setOpen(true);
};
const handleClose = () => {
setOpen(false);
};
return (
<div>
<Dialog onClose={handleClose} aria-labelledby="customized-dialog-title" open={open}>
<DialogTitle id="customized-dialog-title" onClose={handleClose}>
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={handleClose} color="primary">
Save changes
</Button>
</DialogActions>
</Dialog>
</div>
);
}
Card.js
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Card from '@material-ui/core/Card';
import CardActionArea from '@material-ui/core/CardActionArea';
import CardActions from '@material-ui/core/CardActions';
import CardContent from '@material-ui/core/CardContent';
import CardMedia from '@material-ui/core/CardMedia';
import Button from '@material-ui/core/Button';
import Typography from '@material-ui/core/Typography';
import AddShoppingCartIcon from '@material-ui/icons/AddShoppingCart';
import InfoIcon from '@material-ui/icons/Info';
import MaterialModal from './Modal';
const useStyles = makeStyles({
root: {
maxWidth: 345,
["@media (max-width: 376px)"]: {
maxWidth: 275,
},
["@media (max-width: 321px)"]: {
maxWidth: 250,
}
},
media: {
height: 140,
maxHeight: 140,
},
button: {
paddingLeft: "8rem",
paddingBottom: "1rem"
},
button1: {
paddingLeft: "4rem",
paddingBottom: "1rem"
}
});
export default function MediaCard(props) {
const classes = useStyles();
const [open, setOpen] = React.useState(false);
const handleClickOpen = () => {
setOpen(true);
};
const handleClose = () => {
setOpen(false);
};
return (
<Card className={classes.root}>
<CardActionArea>
<CardMedia
className={classes.media}
image={props.image}
title={props.title}
/>
<CardContent>
<Typography gutterBottom variant="h5" component="h2">
{props.header}
</Typography>
<Typography variant="body2" color="textSecondary" component="p">
{props.price}
</Typography>
</CardContent>
</CardActionArea>
<CardActions>
<Button className={classes.button1} size="small" color="primary">
<AddShoppingCartIcon/>
</Button>
<Button className={classes.button} size="small" color="primary" onClick={handleClickOpen}>
<InfoIcon/>
</Button>
</CardActions>
<MaterialModal open={open} onClose={handleClose} aria-labelledby="customized-dialog-title"/>
</Card>
);
}
解决方案
推荐阅读
- ms-access - 如何在子表单中显示搜索查询的结果(通过单击“搜索”按钮完成)?
- sql - NOT IN 在 Listagg 函数中没有按预期工作
- python - Python:如何在不使用 median() 调用的情况下读取 .txt 数字文件以查找所述数字的中位数?
- python - 修改熊猫条形图的轴标签
- node.js - 错误:找不到命令“开始”。info 访问 https://yarnpkg.com/en/docs/cli/run 以获取有关此命令的文档
- javascript - 表和生成器的范围从 到
- node.js - 在 Ubuntu Server 20.04LTS 上全局安装 PM2 时出错
- ios - 如何计算 UIViewController 的内在内容高度?
- prolog - 为什么 prolog 无法找到到顶点的路径(在图中)?
- user-interface - 外部监视器的 JavaFx 问题