【问题标题】:How to open or close a Modal defined in one Class from a Button defined in another Class如何从另一个类中定义的按钮打开或关闭一个类中定义的模态
【发布时间】:2016-07-07 11:16:36
【问题描述】:

我正在用 React 和 react-bootstrap 编写一个简单的 webapp。我有两个按钮应该打开两个不同的模态。我想将包含按钮的类与两个模态类分开,例如

var React = require('react');
var ReactDOM = require('react-dom');

import { Button, Modal, closeButton } from 'react-bootstrap';

var Jumbo = React.createClass ({
  render() {
    return (
      <div className="container">
        <Button onClick={Modal1.open}>Modal1</Button>
        <Button onClick={Modal2.open}>Modal2</Button>
        <Modal1 />
        <Modal2 />
      </div>
    );
  }
});

var Modal1 = React.createClass ({
  getInitialState() {
    return {
      showModal: false
    };
  },

  close() {
    this.setState({
      showModal: false
    });
  },

  open() {
    this.setState({
      showModal: true
    });
  },

  render() {
    return (
      <Modal show={this.state.showModal} onHide={this.close}>
        <Modal.Header closeButton>
          <Modal.Title>Modal1</Modal.Title>
        </Modal.Header>
        <Modal.Body>
          <p>Modal1</p>
        </Modal.Body>
        <Modal.Footer>
          <Button onClick={this.close}>Close</Button>
        </Modal.Footer>
      </Modal>
    );
  }
});

var Modal2 = React.createClass ({
  getInitialState() {
    return {
      showModal: false
    };
  },

  close() {
    this.setState({
      showModal: false
    });
  },

  open() {
    this.setState({
      showModal: true
    });
  },

  render() {
    return (
      <Modal show={this.state.showModal} onHide={this.close}>
        <Modal.Header closeButton>
          <Modal.Title>Modal2</Modal.Title>
        </Modal.Header>
        <Modal.Body>
          <p>Modal2</p>
        </Modal.Body>
        <Modal.Footer>
          <Button onClick={this.close}>Close</Button>
        </Modal.Footer>
      </Modal>
    );
  }
});

ReactDOM.render(<Jumbo />, document.getElementById('modal'));

但是onClick={ModalN.open} 不起作用。通常我会将按钮放在模态类中(根据the documented example)并执行onClick={this.open},但我想将两个按钮元素放在一起,而不是单独的&lt;div&gt;s。传递对 Modal 的引用的正确方法是什么?

【问题讨论】:

    标签: javascript twitter-bootstrap reactjs bootstrap-modal react-bootstrap


    【解决方案1】:

    onClick={modalN.open} 不起作用,您需要在Jumbo 中包含ModalN 组件:

    var Jumbo = React.createClass ({
      getInitialState() {
        return {
          activeModal: null
        }
      },
    
      openModal(id){
         this.setState({
            activeModal: id
         })
      }
    
      render() {
        return (
          <div className="container">
            <Button onClick={this.openModal.bind(this,1)}>Modal1</Button>
            <Button onClick={this.openModal.bind(this,2)}>Modal2</Button>
            {this.state.activeModal === 1 ? <Modal1 /> :null}
            {this.state.activeModal === 2? <Modal2 /> : null}
          </div>
        );
      }
    });
    

    您还需要将每个 Modal 的初始 showModal 更改为 true,否则它们将永远不会显示(因为从未调用过 open()):

    var Modal1 = React.createClass ({
      getInitialState() {
        return {
          showModal: true
        }
      },
      ...
    });
    

    【讨论】:

    • 谢谢!您的答案中有一些错别字,但这使我走上了正确的道路。为了让我在上面的代码中工作,每个 Modal 的 getInitialState() 函数需要返回 showModal: true,或者当三元运算符激活 &lt;Modal /&gt; 元素时它们仍然隐藏。我还必须在Jumbo 类中添加getInitialState() 以默认设置activeModal: null(或0,我认为这并不重要),以防止出现错误。
    • 很抱歉这么快就接受了这个答案,然后又不接受了。我发现了一个错误 - 当我单击按钮打开 Modal1,然后关闭模态框时,我无法通过按相同的按钮再次打开 Modal1。唯一的方法是单击Modal2 按钮,将其关闭,然后再次单击Modal1 按钮。有没有办法解决这个问题?
    • 我解决了!从React discussion board 我了解到您可以将函数作为属性从父级-> 子级传入。只需向Jumbo 添加一个close() 方法,将activeModal 设置为null,将其作为&lt;ModalN close={this.close} /&gt; 传递,然后在模态类中以{this.props.close} 的形式调用它(例如onHide=onClick={this.props.close} . 您不再需要在 Modal Class 中使用 getInitialState()open()close() 函数。我编辑了答案以反映它。
    • 是的 gr8 抱歉我不能及时回答
    猜你喜欢
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 2020-07-21
    相关资源
    最近更新 更多