簡體   English   中英

如何使用 material-ui 處理“內部鏈接”單擊對話框(模態)

[英]How to handle “inside link” click on Dialog (Modal) with material-ui

如果用戶點擊了模態內的鏈接,我該如何關閉模態? 例如,他們打開一個登錄表單的模式 - 但也有一個忘記密碼的鏈接。 如果他們點擊鏈接,用戶將被帶到頁面 - 但模態保持打開狀態?

鏈接將是 modalcontents 道具的一部分 - 但是 closehandles 在 modalbox 內?

<ModalBox 
  button={{"label": "Log In", "color":"primary"}}
  modalContents={
    <div className="login-form">
      <Grid container spacing={1}>
        <Grid item xs={12} sm={12}>
          <GenericForm 
            initialValues={initialLoginFormValues} 
            fields={fieldsLoginForm}
            buttons={buttonsLoginForm}
            submitHandler={this.loginFormHandler}
          />

          {errorMsg.length > 0 && 
            (
              <div className="error-text">
                {errorMsg}
              </div>
            )
          }

        </Grid>
        <Grid item xs={12} sm={12}>
          <div className="forgot-password-pane">
            <NavLink
              to="/forgotpassword"
              activeClassName="selected">Forgot password?
            </NavLink>
          </div>
        </Grid>
        <Grid item xs={12} sm={12}>
          Don't have an account? Don't worry, you can <NavLink to="/" activeClassName="selected">join here</NavLink>
        </Grid>
      </Grid>
    </div>
  }
/>

模態框

import React, { Component } from 'react';
import Modal from '@material-ui/core/Modal';
import Backdrop from '@material-ui/core/Backdrop';
import Fade from '@material-ui/core/Fade';
import Button from '@material-ui/core/Button';


import IconButton from '@material-ui/core/IconButton';
import CloseIcon from '@material-ui/icons/Close';

//import './ModalBox.scss';

class ModalBox extends Component {
    constructor(props, context) {
        super(props, context);
        this.state = { open: false };
    }

    componentDidUpdate(prevProps) {
      // Typical usage (don't forget to compare props):
      if(this.props.open !== prevProps.open) {
        if(this.props.open){
          this.handleOpen();
        }
      }
    }    

    handleOpen = () => {
      this.setState({open: !this.state.open});
    };

    handleClose = () => {
      this.setState({open: false});

      //if there is a handle close callback - invoke it
      if(this.props.handleClose) {
        this.props.handleClose();
      }
    };

    render() {
        return (
          <>
            {this.props.button &&
              (
                <Button 
                  variant="contained" 
                  color={this.props.button.color} 
                  onClick={this.handleOpen}
                >
                  {this.props.button.label}
                </Button>
              )
            }
            <Modal
              aria-labelledby="transition-modal-title"
              aria-describedby="transition-modal-description"
              className={'modalbox'}
              open={this.state.open}
              onClose={this.handleClose}
              closeAfterTransition
              BackdropComponent={Backdrop}
              BackdropProps={{
                timeout: 500,
              }}
            >
              <Fade in={this.state.open}>
                <div className={'modalboxform ' + this.props.classes}>
                  <IconButton className="close-button" onClick={this.handleClose}>
                    <CloseIcon/>
                  </IconButton>
                  {this.props.modalContents}
                </div>
              </Fade>
            </Modal>
          </>
        );
    }
}

export default ModalBox;

我不確定這是否是生產中的最佳方式,但現在您可以通過向NavLink元素添加onClick事件偵聽器來處理此問題,您的代碼:

  <NavLink
     to="/forgotpassword"
     activeClassName="selected">Forgot password?
  </NavLink>

將此更改為以下內容:

  <NavLink
     to="/forgotpassword"
     activeClassName="selected"
     onClick={this.handleClose}
   >
       Forgot password?
  </NavLink>

就像將代碼移動到您定義模態框組件與所有導入和功能的外觀一樣的地方

或者只需遵循以下代碼:

import React, { Component } from 'react';
import Modal from '@material-ui/core/Modal';
import Backdrop from '@material-ui/core/Backdrop';
import Fade from '@material-ui/core/Fade';
import Button from '@material-ui/core/Button';


import IconButton from '@material-ui/core/IconButton';
import CloseIcon from '@material-ui/icons/Close';

//import './ModalBox.scss';

class ModalBox extends Component {
    constructor(props, context) {
        super(props, context);
        this.state = { open: false };
    }

    componentDidUpdate(prevProps) {
      // Typical usage (don't forget to compare props):
      if(this.props.open !== prevProps.open) {
        if(this.props.open){
          this.handleOpen();
        }
      }
    }    

    handleOpen = () => {
      this.setState({open: !this.state.open});
    };

    handleClose = () => {
      this.setState({open: false});

      //if there is a handle close callback - invoke it
      if(this.props.handleClose) {
        this.props.handleClose();
      }
    };

    render() {
        return (
          <>
            {this.props.button &&
              (
                <Button 
                  variant="contained" 
                  color={this.props.button.color} 
                  onClick={this.handleOpen}
                >
                  {this.props.button.label}
                </Button>
              )
            }
            <Modal
              aria-labelledby="transition-modal-title"
              aria-describedby="transition-modal-description"
              className={'modalbox'}
              open={this.state.open}
              onClose={this.handleClose}
              closeAfterTransition
              BackdropComponent={Backdrop}
              BackdropProps={{
                timeout: 500,
              }}
            >
              <Fade in={this.state.open}>
                <div className={'modalboxform ' + this.props.classes}>
                  <IconButton className="close-button" onClick= 
                      {this.handleClose}>
                    <CloseIcon/>
                  </IconButton>
                  {this.props.modalContents}
                </div>
              </Fade>
            </Modal>
          </>
        );
    }
}

  class extend home Component{
   render(){
     return(
      <ModalBox 
    button={{"label": "Log In", "color":"primary"}}
     modalContents={
       <div className="login-form">
       <Grid container spacing={1}>
         <Grid item xs={12} sm={12}>
          <GenericForm 
            initialValues={initialLoginFormValues} 
            fields={fieldsLoginForm}
            buttons={buttonsLoginForm}
            submitHandler={this.loginFormHandler}
          />

          {errorMsg.length > 0 && 
            (
              <div className="error-text">
                {errorMsg}
              </div>
            )
          }

        </Grid>
        <Grid item xs={12} sm={12}>
          <div className="forgot-password-pane">
            <NavLink
              to="/forgotpassword"
              activeClassName="selected"
              onClick={this.handleClose}
              >Forgot password?
            </NavLink>
          </div>
        </Grid>
        <Grid item xs={12} sm={12}>
          Don't have an account? Don't worry, you can <NavLink to="/" 
       activeClassName="selected">join here</NavLink>
        </Grid>
      </Grid>
    </div>
  
     />
  )
   }
 }


整個代碼在一個文件中,這是我看到的唯一不使用 redux 或 context api 之類的解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM