So che non si tratta di un Reazione idiomatica, ma sto lavorando a un componente React (una scrollview inversa) che deve essere notificato delle modifiche DOM virtuali a valle sia prima che vengano renderizzate sia dopo il rendering.Componente di gorgogliamentoWillUpdate e componentDidUpdate
Questo è un po 'difficile da spiegare così ho fatto un JSFiddle con un punto di partenza: https://jsfiddle.net/7hwtxdap/2/
Il mio obiettivo è quello di avere l'aspetto di registro come:
Begin log
render
rendered small
rendered small
rendered small
before update
rendered big
after update
before update
rendered big
after update
before update
rendered big
after update
Mi rendo conto che a volte React batch DOM cambia e va bene (cioè gli eventi del registro potrebbero essere before update; rendered big; rendered big; after update; ...
) - la parte importante è che mi viene effettivamente notificato prima e dopo le modifiche al DOM.
posso approssimare manualmente il comportamento callback specificando, come fatto qui: https://jsfiddle.net/7hwtxdap/4/. Tuttavia, questo approccio non scala - ho bisogno, ad esempio, di far scoppiare gli eventi dai discendenti piuttosto che dai bambini; e preferisco non dover aggiungere questo tipo di gestori di eventi a ogni componente che uso.
Caso d'uso:
sto lavorando per rendere un "componente scrolling invertito" per i messaggi (dove, quando vengono aggiunti nuovi elementi o elementi esistenti modificare le dimensioni, la base per il cambiamento di scorrimento è dal parte inferiore del contenuto piuttosto che l'ala superiore di ogni app di messaggistica) che ha bambini modificati dinamicamente (simile alla classe <MyElement />
ma con altezza variabile, dati da ajax, ecc.). Questi dati non ricevono dati da un archivio di stato simile a Flux ma piuttosto utilizzano un modello di sincronizzazione dei dati pub-sub (abbastanza approssimativo con setTimeout()).
Per far funzionare lo scorrimento inverso, è necessario fare qualcosa di simile:
anyChildrenOfComponentWillUpdate() {
let m = this.refs.x;
this.scrollBottom = m.scrollHeight - m.scrollTop - m.offsetHeight;
}
anyChildrenOfComponentDidUpdate() {
let m = this.refs.x;
m.scrollTop = m.scrollHeight - m.offsetHeight - this.scrollBottom;
}
È importante sottolineare che a questo progetto, mi piacerebbe essere in grado di avvolgere l'elemento attorno altri elementi che non sono "invertiti scorrimento consapevole "(cioè non è necessario avere un codice speciale per notificare al gestore di scorrimento invertito che sono stati modificati).
Che dire componentWillMount e componentDidUpdate metodi del ciclo di vita? – Pcriulan
Anche quelli non "fanno bolle" con i genitori. –
Come stai gestendo lo stato? Stai usando redux o qualcosa del genere? Inoltre, perché è esattamente necessario sapere quando i bambini si aggiornano? Potrebbe aiutarti se hai spiegato cosa farai con quelle informazioni. Potrebbe esserci un modo diverso di gestirlo. – jaybee