2016-12-23 3 views
-1

Attribut Ich habe eine einfache modale:React Modal ref Nicht definiert! Kann benutzerdefinierte Add

renderModalForm() { 
    return (
     <Modal 
     closeTimeoutMS={150} 
     show={this.state.isModalOpen} 
     onHide={this.isModalOpen.bind(this)} 
     > 
     <Modal.Body> 
      <div className="close-button-modal"> 
      <i className="fa fa-times fa-2x pull-right" onClick={this.onButtonClick.bind(this)}></i> 
      <div className="clearfix"></div> 
      </div> 
      <div ref="test" className="testclassname"> 
      </div> 
     </Modal.Body> 
     </Modal> 
    ); 
    } 

Mein einziges Ziel ist es, ein benutzerdefiniertes Attribut (die leider mit Daten- oder aria- kann nicht gestartet werden, da sie von Dritten definiert ist) zu injizieren, um die div verwiesen von ref="test"

Wenn ich das benutzerdefinierte Attribut zu injizieren versuchen:

someButtonClicked() { 
    setTimeout(() => { 
     this.setState({ 
     isModalOpen: true 
     }) 
    }, 100); 
    var element = ReactDOM.findDOMNode(this.refs.test); 
    element.setAttribute('doku-div', 'form-payment'); 
} 

Hier Element ist immer undefiniert, so setAttribute gescheitert; Wenn ich das Element überprüfe, existiert ref="test" nicht am <div>! Kann mir jemand helfen, warum dieser Hinweis im Modal fehlt?

+0

so die setState die modale zu öffnen ist eigentlich auch innerhalb einer buttonClickHandler-Methode aufgerufen. Also kann ich es nicht innerhalb von componentDidMount – user1955934

Antwort

0

Versuchen Sie, Ihren Code auf ComponentDidMount oder ComponentDidUpdate Methode zu verschieben. Refs sollten dort nicht undefiniert sein.

Sie können auch einen Rückruf speichern einen Verweis auf den DOM-Knoten verwenden:

<Modal.Body> 
      <div className="close-button-modal"> 
      <i className="fa fa-times fa-2x pull-right" onClick={this.onButtonClick.bind(this)}></i> 
      <div className="clearfix"></div> 
      </div> 
      <div ref="{(testNode) => { this.testNode = testNode; }}" className="testclassname"> 
      </div> 
</Modal.Body> 

Und dann diese Referenz verwenden anstelle der Verwendung ReactDOM:

someButtonClicked() { 
    setTimeout(() => { 
     this.setState({ 
      isModalOpen: true 
     }) 
    }, 100); 

    var element = this.testNode; 
    this.testNode.setAttribute('doku-div', 'form-payment'); 
} 
+0

verschieben, so dass der setState zum Öffnen des Modals auch innerhalb einer buttonClickHandler-Methode aufgerufen wird .. Also kann ich es nicht in componentDidMount verschieben, das bearbeiten Frage zur Klarstellung – user1955934

+0

Sie können 'this.testNode' verwenden, das einen Verweis auf das DOM-Element in Ihrem Click-Handler enthält. –

+0

Ich habe Ihren Vorschlag versucht, aber ref wird immer noch nicht gerendert: (... Ich kann den Code auch nicht in componentDidMount setzen, weil das Modal + seine Kinder nicht einmal gerendert werden, wenn es am Anfang versteckt/nicht geöffnet ist. Ich denke, es wird nur gerendert, wenn ich setState ({isModalOpen: true}) ... aber das Problem bleibt immer noch .. ref fehlt : X – user1955934

Verwandte Themen