これは慣用的なReactではないことがわかっていますが、レンダリングされる前とレンダリングされた後の両方で下流の仮想DOMの変更を通知する必要があるReactコンポーネント(逆スクロールビュー)時々リアクト私は承知しているBubbling componentWillUpdateとcomponentDidUpdate
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
:https://jsfiddle.net/7hwtxdap/2/
私の目標は、のようなログを見ていることです。
これは私が出発点とJSFiddleを作ったので、説明するの少し難しいですDOMの変更が一括して行われます(つまり、ログイベントはbefore update; rendered big; rendered big; after update; ...
になる可能性があります)。重要な点は、DOMが変更される前後に実際に通知されることです。
、ここで行ったように私は手動で、コールバックを指定することで動作を近似することができる:https://jsfiddle.net/7hwtxdap/4/。しかし、このアプローチは規模が拡大しません。たとえば、子どもではなく子孫からのイベントを吹き飛ばすことが必要です。この種のイベントハンドラをに追加する必要はありません。すべてコンポーネントを使用します。
ユースケース:私は新しい要素が追加されたり、既存の要素のサイズを変更すると、スクロール変更の根拠からであり、(メッセージのために「逆スクロールコンポーネント」を作ることに取り組んでいます
(<MyElement />
クラスに似ていますが、高さが可変で、ajaxからのデータなど)、動的に変更された子を持つすべてのメッセージングアプリケーションではなく、コンテンツの下端です。これらは、Fluxのような状態ストアからデータを取得するのではなく、pub-subデータ同期モデルを使用しています(setTimeout()とかなりよく似ています)。
逆スクロール作業を行うには、あなたがこのような何か実行する必要があります。この設計に重要なこと
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;
}
を、私は「スクロール反転されていない他の要素の周りの要素をラップできるようにしたいのですが(すなわち、逆スクロールハンドラに変更したことを通知する特別なコードを持つ必要はありません)。
何をしたいコンポーネントを飾りますか? – Pcriulan
これらはまた、親に「バブル」しません。 –
どのように状態を管理していますか?あなたはレフィックスなどを使っていますか?また、なぜ正確にあなたは子供たちが更新するかを知る必要がありますか?あなたがその情報で何をするのか説明しておけば助けになるかもしれません。それを処理する別の方法があるかもしれません。 – jaybee