简体   繁体   English

在Reactjs中打开子模式时如何关闭父模式?

[英]how close parent modal when open child modal in Reactjs?

I can not close current modal when open new modal in React js. 在React js中打开新模态时,我无法关闭当前模态。 please help me. 请帮我。 I have parent modal: Register_modal and child of it: RegisterCode_Modal parent modal is called in header component: 我有父模式:Register_modal及其子模式:RegisterCode_Modal父模式在标头组件中调用:

first: Header component 第一:标题组件

this component call first modal and pass open and close props to it: 此组件调用第一个模态,并向其传递打开和关闭道具:

import React , {Component} from 'react';
import ReactDOM from 'react-dom';
import {NavLink} from 'react-router-dom';
import Register_Modal from './Register_Modal';


export default class Header extends Component {
    constructor() {
        super();

        this.state = {
         modalIsOpen: false
        };
    this.openModal = this.openModal.bind(this);
    this.closeModal = this.closeModal.bind(this);
    }

    openModal(e) {
        e.preventDefault();
        this.setState({modalIsOpen: true});
      }

    closeModal(e) {
        e.preventDefault();
        this.setState({modalIsOpen: false});
      }

  render() {
    return (
<div>
<div className="button navbar-right">
   <button className="navbar-btn nav-button wow bounceInRight login"  data-wow-delay="0.45s">ورود</button>
   <button className="navbar-btn nav-button wow fadeInRight"  data-wow-delay="0.48s" onClick={this.openModal} >ثبت نام</button>
                        <div >
 <Register_Modal open={this.state.modalIsOpen} close={this.closeModal} />
                        </div>

</div>
    );
  }


}
---------------------------------------------------------------------------

second: parent component 第二:父组件

export default class Register_Modal extends Component {
   constructor(props){
       super(props);
       this.state={
           codemodal: false
       };
       this.openCodeModal=this.openCodeModal.bind(this);
       this.closeCodeModal=this.closeCodeModal.bind(this);
   }
   openCodeModal(e){
       e.preventDefault();
       this.setState({codemodal: true});
   }
   closeCodeModal(e){
    e.preventDefault();
    this.setState({codemodal: false});
}
    render() {
      return (
        <div>  
              <Modal  
              isOpen={this.props.open} 
              onRequestClose={this.props.close}
              ariaHideApp={false}
              contentLabel="selected option"
              isClose={this.props.close}
              style={customStyles}
              >
              <h2>salammmmm</h2>
              <button onClick={this.props.close} >انصراف</button>
              <button onClick={this.openCodeModal} >بعدی</button>

              </Modal>
              <div className="ReactModalPortal">
              <RegisterCode_Modal open={this.state.codemodal} close={this.closeCodeModal}  />
              </div>
              {this.props.close}
          </div>

      );}
    }
------------------------------------------------------------------

third: child component 第三:子组件

export default class RegisterCode_Modal extends Component {
    constructor(props){
        super(props);
        console.log("injaaaaa");
    }


 render() {
   return (
     <div>  
           <Modal  
           isOpen={this.props.open} 
           onRequestClose={this.props.close}
           ariaHideApp={false}
           contentLabel="ورود کد"
           isClose={this.props.close}
           style={customStyles}
           >
           <h2>مرحله کد</h2>
           <button onClick={this.props.close} >تائید</button>
           </Modal>
       </div>

   );}
 }

You can simply achieve this by rendering them conditionally. 您可以简单地通过有条件地渲染它们来实现。
I personally so this: 我个人这样:

export default class RegisterModal extends Component {
  state = {
    showBaseModal: true,
    codemodal: false,
  };

  openCodeModal = () => {
    this.setState({
      codemodal: true,
      showBaseModal: false,
    });
  };

  closeCodeModal = () => {
    this.setState({ codemodal: false });
  };

  render() {
    return (
      <div>
        {this.state.showBaseModal && (
          <Modal
            isOpen
            onRequestClose={this.props.close}
            ariaHideApp={false}
            isClose={this.props.close}
          >
            <button onClick={this.props.close}>Close</button>
            <button onClick={this.openCodeModal}>Next</button>
          </Modal>
        )}
        {this.state.codemodal && (
          <RegisterCode_Modal
            open={this.state.codemodal}
            close={this.closeCodeModal}
          />
        )}
      </div>
    );
  }
}

Adding an extra state for base modal. 为基本模态添加额外的状态。 On openCodeModal event, toggle it to false to stop both modals. openCodeModal事件上,将其切换为false可停止这两种模态。
Set isOpen always to true for both modals, and then render RegisterModal component conditionally . 将两个模态的isOpen始终设置为true ,然后有条件地渲染RegisterModal组件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM