从 Header parent 组件打开 Material-UI 对话框模式
Opening a Material-UI dialog modal from a Header parent component
我有一个 header 组件与注册对话框模式组件分开。所以就像一个 parent 一个 child 组件。我想从 headerlink 组件 (parent)
调用注册对话框 (child)
这是我的 headerlink 组件:
...
import Register from "../Register";
....
export default function HeaderLinks(props) {
const classes = useStyles();
const [open, setOpen] = React.useState(false);
const handleClickOpen = () => {
setOpen(true);
};
const handleClose = () => {
setOpen(false);
};
return (
<List className={classes.list}>
<ListItem className={classes.listItem}>
<Button
color="transparent"
className={classes.navLink}
onClick={handleClickOpen}
>
Register
</Button>
</ListItem>
<ListItem className={classes.listItem}>
<Button
color="transparent"
className={classes.navLink}
>
Log In
</Button>
</ListItem>
</List>
);
<Register open={handleClickOpen} onClose={handleClose} />;
}
注册对话框组件只是从 Material-UI 的文档中复制并删除了按钮。
export default function Register() {
const [open, setOpen] = React.useState(false);
const classes = useStyles();
const theme = useTheme();
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}>
Register
</DialogTitle>
<DialogContent dividers>
...content...
</DialogContent>
</Dialog>
</div>
);
}
当我单击 headerLink 上的“注册”按钮时,没有任何反应。不确定我还遗漏了什么,因为没有错误。
在您的 HeaderLinks
上,您已经 return 在该函数上输入了一个值,因此下面的其余源代码将不会执行。
return (
<List className={classes.list}>
...
</List>
);
<Register open={handleClickOpen} onClose={handleClose} />; // <-- code will not be reached
所以只需将它移到 return 语句中并将它们关闭在单个标签上,因为相邻的 JSX 元素必须包含在封闭标签中。将道具传递给 Register
,它不需要内部状态,因为它的 open
道具(根据您的设计看来)是由 HeaderLinks
组件
控制的
export default function HeaderLinks() {
const classes = useStyles();
const [open, setOpen] = React.useState(false);
const handleClickOpen = () => {
setOpen(true);
};
const handleClose = () => {
setOpen(false);
};
return (
<>
<List className={classes.list}>
<ListItem className={classes.listItem}>
<Button
color="transparent"
className={classes.navLink}
onClick={handleClickOpen}
>
Register
</Button>
</ListItem>
<ListItem className={classes.listItem}>
<Button color="transparent" className={classes.navLink}>
Log In
</Button>
</ListItem>
</List>
<Register open={open} handleClose={handleClose} />
</>
);
}
function Register({ open, handleClose }) {
const classes = useStyles();
const theme = useTheme();
return (
<div>
<Dialog
onClose={handleClose}
aria-labelledby="customized-dialog-title"
open={open}
>
<DialogTitle id="customized-dialog-title" onClose={handleClose}>
Register
</DialogTitle>
<DialogContent dividers>...content...</DialogContent>
</Dialog>
</div>
);
}
我有一个 header 组件与注册对话框模式组件分开。所以就像一个 parent 一个 child 组件。我想从 headerlink 组件 (parent)
调用注册对话框 (child)这是我的 headerlink 组件:
...
import Register from "../Register";
....
export default function HeaderLinks(props) {
const classes = useStyles();
const [open, setOpen] = React.useState(false);
const handleClickOpen = () => {
setOpen(true);
};
const handleClose = () => {
setOpen(false);
};
return (
<List className={classes.list}>
<ListItem className={classes.listItem}>
<Button
color="transparent"
className={classes.navLink}
onClick={handleClickOpen}
>
Register
</Button>
</ListItem>
<ListItem className={classes.listItem}>
<Button
color="transparent"
className={classes.navLink}
>
Log In
</Button>
</ListItem>
</List>
);
<Register open={handleClickOpen} onClose={handleClose} />;
}
注册对话框组件只是从 Material-UI 的文档中复制并删除了按钮。
export default function Register() {
const [open, setOpen] = React.useState(false);
const classes = useStyles();
const theme = useTheme();
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}>
Register
</DialogTitle>
<DialogContent dividers>
...content...
</DialogContent>
</Dialog>
</div>
);
}
当我单击 headerLink 上的“注册”按钮时,没有任何反应。不确定我还遗漏了什么,因为没有错误。
在您的 HeaderLinks
上,您已经 return 在该函数上输入了一个值,因此下面的其余源代码将不会执行。
return (
<List className={classes.list}>
...
</List>
);
<Register open={handleClickOpen} onClose={handleClose} />; // <-- code will not be reached
所以只需将它移到 return 语句中并将它们关闭在单个标签上,因为相邻的 JSX 元素必须包含在封闭标签中。将道具传递给 Register
,它不需要内部状态,因为它的 open
道具(根据您的设计看来)是由 HeaderLinks
组件
export default function HeaderLinks() {
const classes = useStyles();
const [open, setOpen] = React.useState(false);
const handleClickOpen = () => {
setOpen(true);
};
const handleClose = () => {
setOpen(false);
};
return (
<>
<List className={classes.list}>
<ListItem className={classes.listItem}>
<Button
color="transparent"
className={classes.navLink}
onClick={handleClickOpen}
>
Register
</Button>
</ListItem>
<ListItem className={classes.listItem}>
<Button color="transparent" className={classes.navLink}>
Log In
</Button>
</ListItem>
</List>
<Register open={open} handleClose={handleClose} />
</>
);
}
function Register({ open, handleClose }) {
const classes = useStyles();
const theme = useTheme();
return (
<div>
<Dialog
onClose={handleClose}
aria-labelledby="customized-dialog-title"
open={open}
>
<DialogTitle id="customized-dialog-title" onClose={handleClose}>
Register
</DialogTitle>
<DialogContent dividers>...content...</DialogContent>
</Dialog>
</div>
);
}