2015-04-06 5 views

Antwort

28

Sie suchen nach dem benutzerdefinierten modalen Trigger, der die OverlayMixin verwendet und Ihnen ermöglicht, den Status des Modales selbst zu verwalten. Sie können steuern, ob das Modal mit this.setState({isModalOpen: true}) angezeigt wird, um das Äquivalent zu dem zu erreichen, was Sie in Ihrem Beitrag im folgenden Beispiel gefordert haben. Der folgende Code ist von der Reaktion-Bootstrap-Website (http://react-bootstrap.github.io/components.html#modals):

const CustomModalTrigger = React.createClass({ 
    mixins: [OverlayMixin], 

    getInitialState() { 
    return { 
     isModalOpen: false 
    }; 
    }, 

    handleToggle() { 
    this.setState({ 
     isModalOpen: !this.state.isModalOpen 
    }); 
    }, 

    render() { 
    return (
     <Button onClick={this.handleToggle} bsStyle='primary'>Launch</Button> 
    ); 
    }, 

    // This is called by the `OverlayMixin` when this component 
    // is mounted or updated and the return value is appended to the body. 
    renderOverlay() { 
    if (!this.state.isModalOpen) { 
     return <span/>; 
    } 

    return (
     <Modal bsStyle='primary' title='Modal heading' onRequestHide={this.handleToggle}> 
     <div className='modal-body'> 
      This modal is controlled by our custom trigger component. 
     </div> 
     <div className='modal-footer'> 
      <Button onClick={this.handleToggle}>Close</Button> 
     </div> 
     </Modal> 
    ); 
    } 
}); 

React.render(<CustomModalTrigger />, mountNode); 

UPDATE (4 Aug, 2015)

In der neuesten Version von React-Bootstrap, ob ein modal angezeigt wird oder nicht wird durch eine show Stütze gesteuert, die an das Modal übergeben wird. Die OverlayMixin wird nicht mehr benötigt, um den modalen Zustand zu steuern. Die Steuerung des Zustandes des Modales erfolgt weiterhin über setState, in diesem Beispiel über this.setState({ showModal: true }). Im Folgenden wird anhand des Beispiels auf dem React-Bootstrap Webseite aus:

const ControlledModalExample = React.createClass({ 

    getInitialState(){ 
    return { showModal: false }; 
    }, 

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

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

    render() { 
    return (
     <div> 
     <Button onClick={this.open}> 
      Launch modal 
     </Button> 

     <Modal show={this.state.showModal} onHide={this.close}> 
      <Modal.Header closeButton> 
      <Modal.Title>Modal heading</Modal.Title> 
      </Modal.Header> 
      <Modal.Body> 
      <div>Modal content here </div> 
      </Modal.Body> 
      <Modal.Footer> 
      <Button onClick={this.close}>Close</Button> 
      </Modal.Footer> 
     </Modal> 
     </div> 
    ); 
    } 
}); 
+0

funktioniert nicht, wenn Sie ein Formular-Element zugreifen müssen in der Modal mit 'refs' – vaughan

+0

in diesem Thema läuft - http://stackoverflow.com/questions/30782948/why-calling-react-setstate- method-doesnt-mutate-the-state-sofort "setState() mutiert nicht sofort this.state, sondern erzeugt einen ausstehenden Statusübergang. Der Zugriff auf this.state nach dem Aufruf dieser Methode kann möglicherweise den vorhandenen Wert zurückgeben. Es gibt keine Garantie für synchrone Die Aufrufe von setState und Calls können zur Steigerung der Performance stapelweise durchgeführt werden. " Ich rufe setState und es aktualisiert nicht – Steve

+0

Steve, was ist Ihr spezielles Problem? Vielleicht können Sie eine Frage mit Ihrem Code und dem Problem, das Sie haben, posten. – Mark

8

Ihre modal eine show prop haben und eine onHide prop zu bestimmen, wenn es angezeigt wird. Z.B .:

<Modal show={this.state.showModal} onHide={this.close}> 

Die onHide Funktion ändert einfach showModal staatliches Eigentum. Ihre modal ist/ausgeblendet wurde, basierend auf der übergeordneten Zustand:

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

Wenn Sie das modale innerhalb des modalen selbst schließen möchten, können Sie die onHide Funktion definiert auf der übergeordneten über props auslösen können. Zum Beispiel ist dies eine Taste irgendwo innerhalb des modalen Schließen es:

<button type="button" className="close" onClick={this.props.onHide}> 
    <span>&times;</span> 
</button> 

Here is a fiddle diesen Workflow zu simulieren.

+2

Ich würde gerne Ihre Argumentation hören, wenn Sie Ihre Meinung ändern. –

+0

Dies ist kein Bootstrap-Modal. –

+0

https://jsfiddle.net/16j1se1q/1/ So sieht ein Modal aus.Dein Beispiel ist ein Beispiel dafür, wie man ein div in react erscheinen und verschwinden lässt, was nützlich ist, aber nicht für dieses Problem –

1

öffnen und schließen reagieren-Bootstrap-modal programmatisch/dynamisch aus dem Zustand:

Hier habe ich die ES6 Syntax Klasse Komponente Syntax.

import React, { Component, PropTypes } from 'react'; 
import { Modal, Button } from 'react-bootstrap'; 
import './GenericModal.scss'; 

class GenericModal extends Component { 
    constructor(props, context) { 
    super(props, context); 

    this.state = { 
    showModal: false 
    }; 

    this.open = this.open.bind(this); 
    this.close = this.close.bind(this); 
} 


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

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

render() { 
    return(
    <div> 
     <div>I am a Bootstrap Modal</div> 
     <Button onClick={this.open}>Show Modal</Button> 
     <div> 
     <Modal className="modal-container" 
      show={this.state.showModal} 
      onHide={this.close} 
      animation={true} 
      bsSize="small"> 

      <Modal.Header closeButton> 
      <Modal.Title>Modal title</Modal.Title> 
      </Modal.Header> 

      <Modal.Body> 
      One of fine body......... 
      </Modal.Body> 

      <Modal.Footer> 
      <Button onClick={this.close}>Close</Button> 
      <Button bsStyle="primary">Save changes</Button> 
      </Modal.Footer>   
     </Modal> 
     </div> 
    </div> 
); 
} 
} 

export default GenericModal;