reactjs - 自定义/禁用 Material-UI 对话框的触控机制
问题描述
有人可以帮我自定义/禁用 Material-UI 对话框的触摸机制吗?我有取消和确认按钮,这正是我想要用来关闭对话框的。但是,从下拉菜单中进行选择会导致对话框根据文档自动关闭。而且我无法在文档本身中看到如何做到这一点。
问题
我遇到的问题是自动关闭正在完成我希望取消按钮完成的工作。即:关闭对话框并清空数组。
我会很感激你的帮助。
解决方案
使用 Material-UI简单对话框有什么特别的原因吗?
从您的问题来看,您正在寻找一个确认对话框:)
简单的对话触摸机制
触摸机制:
选择一个选项会立即提交该选项并关闭菜单
触摸对话框外部或按返回,取消操作并关闭对话框
另一方面,满足您的需求:
确认对话框
确认对话框要求用户在提交选项之前明确确认他们的选择。例如,用户可以收听多个铃声,但只有在触摸“确定”时才做出最终选择。
在确认对话框中触摸“取消”或按返回,取消操作,放弃任何更改,并关闭对话框。
import React from 'react';
import PropTypes from 'prop-types';
import { makeStyles } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';
import List from '@material-ui/core/List';
import ListItem from '@material-ui/core/ListItem';
import ListItemText from '@material-ui/core/ListItemText';
import DialogTitle from '@material-ui/core/DialogTitle';
import DialogContent from '@material-ui/core/DialogContent';
import DialogActions from '@material-ui/core/DialogActions';
import Dialog from '@material-ui/core/Dialog';
import RadioGroup from '@material-ui/core/RadioGroup';
import Radio from '@material-ui/core/Radio';
import FormControlLabel from '@material-ui/core/FormControlLabel';
const options = [
'None',
'Atria',
'Callisto',
'Dione',
'Ganymede',
'Hangouts Call',
'Luna',
'Oberon',
'Phobos',
'Pyxis',
'Sedna',
'Titania',
'Triton',
'Umbriel',
];
function ConfirmationDialogRaw(props) {
const { onClose, value: valueProp, open, ...other } = props;
const [value, setValue] = React.useState(valueProp);
const radioGroupRef = React.useRef(null);
React.useEffect(() => {
if (!open) {
setValue(valueProp);
}
}, [valueProp, open]);
const handleEntering = () => {
if (radioGroupRef.current != null) {
radioGroupRef.current.focus();
}
};
const handleCancel = () => {
onClose();
};
const handleOk = () => {
onClose(value);
};
const handleChange = (event) => {
setValue(event.target.value);
};
return (
<Dialog
disableBackdropClick
disableEscapeKeyDown
maxWidth="xs"
onEntering={handleEntering}
aria-labelledby="confirmation-dialog-title"
open={open}
{...other}
>
<DialogTitle id="confirmation-dialog-title">Phone Ringtone</DialogTitle>
<DialogContent dividers>
<RadioGroup
ref={radioGroupRef}
aria-label="ringtone"
name="ringtone"
value={value}
onChange={handleChange}
>
{options.map((option) => (
<FormControlLabel value={option} key={option} control={<Radio />} label={option} />
))}
</RadioGroup>
</DialogContent>
<DialogActions>
<Button autoFocus onClick={handleCancel} color="primary">
Cancel
</Button>
<Button onClick={handleOk} color="primary">
Ok
</Button>
</DialogActions>
</Dialog>
);
}
ConfirmationDialogRaw.propTypes = {
onClose: PropTypes.func.isRequired,
open: PropTypes.bool.isRequired,
value: PropTypes.string.isRequired,
};
const useStyles = makeStyles((theme) => ({
root: {
width: '100%',
maxWidth: 360,
backgroundColor: theme.palette.background.paper,
},
paper: {
width: '80%',
maxHeight: 435,
},
}));
export default function ConfirmationDialog() {
const classes = useStyles();
const [open, setOpen] = React.useState(false);
const [value, setValue] = React.useState('Dione');
const handleClickListItem = () => {
setOpen(true);
};
const handleClose = (newValue) => {
setOpen(false);
if (newValue) {
setValue(newValue);
}
};
return (
<div className={classes.root}>
<List component="div" role="list">
<ListItem button divider disabled role="listitem">
<ListItemText primary="Interruptions" />
</ListItem>
<ListItem
button
divider
aria-haspopup="true"
aria-controls="ringtone-menu"
aria-label="phone ringtone"
onClick={handleClickListItem}
role="listitem"
>
<ListItemText primary="Phone ringtone" secondary={value} />
</ListItem>
<ListItem button divider disabled role="listitem">
<ListItemText primary="Default notification ringtone" secondary="Tethys" />
</ListItem>
<ConfirmationDialogRaw
classes={{
paper: classes.paper,
}}
id="ringtone-menu"
keepMounted
open={open}
onClose={handleClose}
value={value}
/>
</List>
</div>
);
}
您可以在这里查看工作对话框:
希望它有所帮助,如果没有,请随时解释有关该问题的更多信息,甚至添加代码片段:)
推荐阅读
- odata - CDS 年份类型/从整数类型中删除千位分隔符
- html - 如何在照片之间添加形状
- reactjs - React 16.8.6 + react 数据表错误 TypeError: Object(...) is not a function
- python - Tensorflow 数据集将图像分割成图块
- apache-nifi - Apache NiFi DBCPConnectionPool ORA-00933:SQL 命令未正确结束“从双重选择 1;”
- javascript - 如何获取 img 的下一个 id
- c++ - 在多参数情况下使用转换构造函数
- javascript - 粘性辅助滚动条
- git - 无法将凭据添加到 Jenkins Bitbucket 分支源插件
- swift - 我不断收到可可豆荚和安装 fireBase 的错误