繁体   English   中英

React:如何关闭从父组件打开的子组件的模态

[英]React: How to close a modal from child opened from parent component

我通过将父状态作为道具传递给子组件来打开子组件模态。 有没有办法从子组件本身关闭模态而不受父组件的任何干扰。

class Parent extends Component {

    constructor(props) {
      super(props);
      this.showModal = this.showModal.bind(this);
      this.state = {
        showModal: false
      };
    }
    showModal() {
      this.setState({ showModal: true });
    }
    renderRow() {
      return (
        <tr>
          <td onClick={() => this.setState({ show: true })}>test</td>
          <ChildModal show={this.state.showModal}/>
        </tr>
      );
    }
}


class ChildModal extends Component {
  render() {
    return (
       <Modal show={this.props.showModal}>
            <Modal.Header closeButton> 
            <Modal.Title>Test</Modal.Title> 
            </Modal.Header>
            <Modal.Body> 
                {/* some text */}
            </Modal.Body>
        </Modal>
    );
  }
}

我希望我的孩子模态是独立的。 这在反应中甚至可能吗?

您需要将callback as a props Child component callback as a props传递, when you click on closeButton in child Parent Component when you click on closeButton in child ,它会更新Parent Component

// Parent Component
callbackModal = () => {
   this.setState({ showModal: false });
}
//ChildButton
closeButtonClickHandler = () => {
  this.props.callbackModal();
}

局部状态变量只能在声明它的组件内部进行控制。

如果不从父组件传递更改传递状态的方法,您将无法从子组件内部关闭模态。

所以为了关闭你的模态,你需要创建一个方法this.closeModal并将它从父级传递给子级......

// Parent
closeModal = () => {
  this.setState({showModal: false});
}
// ...
<ChildModal show={this.state.showModal} handleClose={this.closeModal} />
// ... 

是的,您可以从子组件关闭它,但是您至少需要父组件的一些干扰,这是因为您已经在父组件中定义了该模型的切换状态。

只需定义一个方法,该方法将关闭父组件中的模态,将其作为道具传递给子组件,并在那里调用它。

//in your parent component 
handleModalClose = ()=>{
this.setState({showModal: false})}

现在将它传递给您的子组件,然后在类似的事件中调用它

this.props.handleModalClose()
class Parent extends Component {

constructor(props) {
  super(props);
  this.showModal = this.showModal.bind(this);
  this.closeModal = this.closeModal.bind(this)
  this.state = {
    showModal: false
  };
}
showModal() {
  this.setState({ showModal: true });
}
closeModal() {
  this.setState({ showModal: false });
}
renderRow() {
  return (
    <tr>
      <td onClick={() => this.setState({ show: true })}>test</td>
      <ChildModal show={this.state.showModal} close={this.state.closeModal}/>
    </tr>
  );
}
}

class ChildModal extends Component {
  render() {
    return (
       <Modal show={this.props.showModal}>
            <Modal.Header closeButton> 
            <Modal.Title>Test</Modal.Title> 
            </Modal.Header>
            <Modal.Body> 
                <buttom onClick={this.props.closeModal()}> ......
            </Modal.Body>
        </Modal>
    );
  }
}

当您在父组件中定义状态时,该状态周围的几乎所有内容都从那里处理。 子组件只能以 props 的形式从父组件接收数据。

父组件控制模态的打开和关闭状态,以便您能够从子组件关闭模态,您必须在父组件上定义一个函数closeModal ,该函数将设置showModal变量(在状态中定义)你的父组件)从真回到假。

closeModal = () => {
      this.setState({ showModal: false });
    }

然后将此函数作为道具传递给子组件并从那里调用该函数。 当您单击模态上的关闭按钮时,状态将在父组件上更新。

暂无
暂无

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

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