Ich weiß, das ist nicht idiomatische Reagieren, aber ich arbeite an einer React-Komponente (eine inverse Scrollview), die Downstream virtuellen DOM Änderungen benachrichtigt werden müssen, bevor sie gerendert werden und nachdem sie gerendert werden.Sprudelnde KomponenteWillUpdate und KomponenteDidUpdate
Dies ist ein wenig schwer zu erklären, so machte ich einen JSFiddle mit einem Startpunkt: https://jsfiddle.net/7hwtxdap/2/
Mein Ziel ist es, wie das Protokoll Blick zu haben:
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
mir bewusst bin, die manchmal Reagieren Batch-DOM-Änderungen und das ist in Ordnung (dh die Log-Ereignisse könnten before update; rendered big; rendered big; after update; ...
sein) - wichtiger Teil ist, dass ich tatsächlich vor und nach dem DOM Änderungen benachrichtigt werden.
ich das Verhalten durch Angabe Rückrufe manuell annähern kann, wie hier geschehen: https://jsfiddle.net/7hwtxdap/4/. Dieser Ansatz ist jedoch nicht skalierbar. Ich brauche zum Beispiel Ereignisse, die von Nachkommen statt von Kindern sprudeln. und würde diese Art von Event-Handlern lieber nicht zu jeder Komponente hinzufügen, die ich verwende.
Anwendungsfall:
ich auf sie ein „inverted-Scrolling-Komponente“ für Nachrichten gerade arbeite (wo, wenn neue Elemente hinzugefügt oder bestehende Elemente Größe ändern, ändern die Grundlage für die Rolle aus der ist unten im Inhalt und nicht oben in jeder Messaging-App), die Kinder dynamisch verändert hat (ähnlich der Klasse <MyElement />
, aber mit variabler Höhe, Daten von Ajax usw.). Diese erhalten keine Daten von einem Flux-ähnlichen Zustandsspeicher, sondern verwenden stattdessen ein Pub-Sub-Datensynchronisationsmodell (das ungefähr mit dem setTimeout() angenähert ist).
Um inverse Scrollen funktioniert, müssen Sie so etwas wie dies tun:
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;
}
Wichtig ist zu diesem Entwurf würde ich das Element in der Lage sein mögen, um andere Elemente zu wickeln, die nicht „scrolling invertiert aware "(dh sie müssen keinen speziellen Code haben, um den invertierten Scroll-Handler zu benachrichtigen, dass sie sich geändert haben).
Was componentWillMount und componentDidUpdate Lifecycle-Methoden? – Pcriulan
Die "sprudeln" auch nicht an die Eltern. –
Wie verwalten Sie Staat? Verwenden Sie Redux oder ähnliches? Auch, warum genau müssen Sie wissen, wenn Kinder aktualisieren? Es könnte hilfreich sein, wenn Sie erklären, was Sie mit dieser Information machen. Es könnte einen anderen Weg geben, damit umzugehen. – jaybee