【问题标题】:Open Material UI Dialogs from Parent Component?从父组件打开材质 UI 对话框?
【发布时间】:2020-05-21 09:04:44
【问题描述】:

我需要从它们的父组件打开两个单独的 Material UI 对话框(条款和隐私),这是一个 Material UI 的“简单菜单”。我已经将它们导入并嵌套在父级中,我只是不知道如何让它们在单独的文件中从父级打开。我和this similar question 玩了太久,但无法正常工作。谢谢。

父组件(菜单):

import React from 'react';
import Menu from '@material-ui/core/Menu';
import MenuItem from '@material-ui/core/MenuItem';
import IconButton from '@material-ui/core/IconButton';
import MoreVertIcon from '@material-ui/icons/MoreVert';
import Terms from './Terms';
import Privacy from './Privacy'

const More = () => {
  const [anchorEl, setAnchorEl] = React.useState(null);

  const handleClick = (event) => {
    setAnchorEl(event.currentTarget);
  };

  const handleClose = () => {
    setAnchorEl(null);
  };

  return (
    <div>
      <IconButton
        aria-label="more"
        aria-controls="simple-menu"
        aria-haspopup="true"
        onClick={handleClick}
        edge='end'
      >
        <MoreVertIcon />
      </IconButton>
      <Menu
        id="simple-menu"
        anchorEl={anchorEl}
        keepMounted
        open={Boolean(anchorEl)}
        onClose={handleClose}
      >
        <MenuItem onClick={handleClose}>Terms of Use</MenuItem>
        <MenuItem onClick={handleClose}>Privacy Policy</MenuItem>
      </Menu>
      <Terms />
      <Privacy />
    </div>
  );
}

export default More;

子组件 1(“条款”对话框):

import React from 'react';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import DialogContentText from '@material-ui/core/DialogContentText';
import DialogTitle from '@material-ui/core/DialogTitle';
import Button from '@material-ui/core/Button';

const Terms = () => {

  const [openTerms, setOpen] = React.useState(false);

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

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

  return (
    <Dialog
      open={openTerms}
      onClose={handleCloseTerms}
      aria-labelledby="terms-dialog-title"
      aria-describedby="terms-dialog-description"
    >
      <DialogTitle id="terms-dialog-title">{"Terms of Use"}</DialogTitle>
      <DialogContent>
        <DialogContentText id="terms-dialog-description">
          Terms go here
        </DialogContentText>
      </DialogContent>
      <DialogActions>
        <Button onClick={handleCloseTerms} color="primary" autoFocus>
          Agree
        </Button>
      </DialogActions>
    </Dialog>
  )
}

export default Terms;

子组件 2(“隐私”对话框):

import React from 'react';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import DialogContentText from '@material-ui/core/DialogContentText';
import DialogTitle from '@material-ui/core/DialogTitle';
import Button from '@material-ui/core/Button';

const Privacy = () => {

  const [openPrivacy, setOpen] = React.useState(false);

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

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

  return (
    <Dialog
      open={openPrivacy}
      onClose={handleClosePrivacy}
      aria-labelledby="privacy-dialog-title"
      aria-describedby="privacy-dialog-description"
    >
      <DialogTitle id="alert-dialog-title">{"Privacy Policy"}</DialogTitle>
      <DialogContent>
        <DialogContentText id="privacy-dialog-description">
         Privacy policy goes here
        </DialogContentText>
      </DialogContent>
      <DialogActions>
        <Button onClick={handleClosePrivacy} color="primary" autoFocus>
          Agree
        </Button>
      </DialogActions>
    </Dialog>
  )
}

export default Privacy;

【问题讨论】:

    标签: javascript reactjs material-ui


    【解决方案1】:

    只需将对话框组件的状态提升到父组件,然后将其传递给子组件。

      const More = () => {
      const [anchorEl, setAnchorEl] = React.useState(null);
      const [openDialogName, setOpenDialog] = React.useState(null);
    
      const handleClick = (event) => {
        setAnchorEl(event.currentTarget);
      };
    
      const handleClose = () => {
        setAnchorEl(null);
      };
    
      const openTermsDialog = () => {
        setOpenDialog('TERMS');
        handleClose();
      };
    
      const openPrivacyDialog = () => {
        setOpenDialog('PRIVACY');
        handleClose();
      };
    
      const closeDialog = () => {
        setOpenDialog(null);
      };
    
      return (
        <div>
            {/* ... */}
            <MenuItem onClick={openTermsDialog}>Terms of Use</MenuItem>
            <MenuItem onClick={openPrivacyDialog}>Privacy Policy</MenuItem>
            {/* ... */}
          <Terms open={openDialogName === 'TERMS'} onClose={closeDialog} />
          <Privacy open={openDialogName === 'PRIVACY'} onClose={closeDialog} />
        </div>
      );
    }
    
    export default More;
    

    例如在隐私方面(条款的想法也相同):

    const Privacy = ({ open, onClose }) => {
      return (
        <Dialog
          open={open}
          onClose={onClose}
        >
        {/* ... */}
      );
    };
    

    【讨论】:

    • 感谢@MartinHorváth 运行良好!现在我只在 Privacy.js 和 Terms.js 中分别收到两个关于 openTerms、handleOpenTerms 和 openPrivacy、handleOpenPrivacy 的 no-unused-vars 警告。有什么可以做的吗?
    • 那些就不需要了,你不要使用这些变量,因为你是从父对话框控制对话框,所以把它们全部删除:)
    • 是有道理的,但现在在使用 handleClosePrivacy 或 handleCloseTerms 关闭带有内置按钮的对话框。我假设是因为对话框打开时它没有设置为 true?
    • 没关系,我只是将您的 {onClose} 用于 onClick 属性。多谢! ?
    • 那么,如果您能接受我的回答,我将不胜感激 :)
    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多