2015-07-04 11 views
8

risolto, vedere UPDATE di seguito. È possibile utilizzare questo codice come riferimento per implementare qualcosa simillarReagire: attendere fino a quando tutti i child sono disponibili e chiamare una funzione una volta dopo


Diciamo che ho un genitore reagire componente (ES6):

Parent

import ChildDiv from './ChildDiv' 

export default React.createClass({ 
    displayName: 'ParentDiv', 

    getInitialState() { 
    nodesLoadedToCanvas: 0, 
    workedOnParentOnceAfterAllChildrenWereLoaded: false 
    }, 

    onChildNodeDidMount() { 
    let nodeCount = this.state.nodesLoadedToCanvas + 1 
    this.state.nodesLoadedToCanvas = nodeCount 
    console.log('Mount ' + this.state.nodesLoadedToCanvas + ' nodes so far') 
    }, 

    render() { 
    const {children} = this.props // 'children' is a model collection 

    return (
     <div id='ParentDiv'> 
     {children.map((childDiv) => 
     <ChildDiv data={childDiv} key={childDiv.id} onRender={this.onChildNodeDidMount}/> 
    )} 
     </div> 
    ) 
    }, 

    componentDidMount() { 
    console.log('Parent did mount') 
    }, 

    componentDidUpdate() { 
    let allNodesArePresent = (this.state.nodesLoadedToCanvas === this.props.children.length) 
    if (!this.state.workedOnParentOnceAfterAllChildrenWereLoaded) { 
     console.log('Do something') 
     this.state.workedOnParentOnceAfterAllChildrenWereLoaded= true 
    } 
    } 
}) 

e un bambino componenti come questo

Bambino

export default React.createClass({ 
    displayName: 'ParentDiv', 

    render() { 
    const {data} = this.props 

    return (
     <div id='ParentDiv'> 
     data.name 
     </div> 
    ) 
    }, 

    componentDidMount() { 
    console.log('ChildDiv did mount') 
    this.props.onRender() // tell parent that child did mount 
    }, 

    componentDidUpdate() { 
    } 
}) 

Perché la mia console dicendo

Parent did Mount 
ChildDiv did Mount 
ChildDiv did Mount 
ChildDiv did Mount 

E non

ChildDiv did Mount 
ChildDiv did Mount 
ChildDiv did Mount 
Parent did Mount 

?

Come posso far richiamare una funzione dopo il rendering del genitore completo (e di tutti i suoi childs)?

UPDATE

Ho risolto questo con l'ingresso di @nash_ag con l'aggiunta di un parametro onRender={this.onChildNodeDidMount} alla mia etichetta (vedi sopra), chiamare la funzione in ChildDiv in componentDidMount() e può ora decidere se tutti i nodi sono stati caricati a i miei genitori componentDidUpdate() metodo. Ho aggiornato il mio codice sopra.

+0

Puoi approfondire un po 'quello che vuoi fare? L'ordine dei log ha senso poiché un bambino non può trovarsi nel documento prima del suo genitore. Tuttavia, quando viene chiamato componentDidMount, tutti i componenti sono già visualizzati. –

+0

Voglio connettere i child con una connessione JSPlumb. Per questo devono essere presenti sul DOM. Se inserisco l'operazione di connessione in 'componentDidUpdate()' le mie connessioni verranno disegnate (dopo alcuni tentativi falliti) ma saranno ridisegnate ogni volta che il componente si aggiorna. Questo uccide le mie prestazioni e non è bello ... – Benvorth

+0

Dovrebbe funzionare bene in componentDidMount –

risposta

6

Probabilmente si può usare componentDidUpdate() per verificare se tutti i bambini sono finiti, poiché questo viene chiamato ogni volta che si esegue il rendering di un bambino dinamico.

Una volta ricevuto l'ultimo (confronto dagli oggetti di scena), è possibile procedere con l'ulteriore elaborazione.

+0

Grazie per l'input. Hai un'idea su come determinare meglio se tutti i child hanno eseguito il rendering? – Benvorth

+0

'React.Children' è quello che potrebbe essere in grado di aiutare. Controllare: https://facebook.github.io/react/docs/top-level-api.html#react.children –

+0

Questo ha funzionato perfettamente per me in quanto avevo bisogno di un modo per sapere quando i puntelli di un bambino sono stati aggiornati. Grazie! –

Problemi correlati