無限スクロールリスト用のIntersectionObserverを設定しようとしています。リストの最後の項目に達した場合は、IntersectionObserverにチェックします。VueセットアップIntersectionObserver
mounted() {
const config = {
treshold: 1
};
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.intersectionRatio > 0) console.log(entry.target);
});
}, config);
observer.observe(this.lastRenderedDeal());
}
マイリスト項目は、次のようにレンダリングされています:私はref
を使用し、最後のrenderedDealをフェッチするには
<deal :deal="deal"
:key="index"
ref="deals"
v-for="(deal, index) in deals"
</deal>
これまでのところ、私のIntersectionObserverセットアップは、次のようになります価格:
lastRenderedDeal() {
const deals = this.$refs.deals;
return deals ? deals[deals.length - 1].$el : null;
}
これは初期設定で機能し、トリガします。問題は、無限のスクロールが必要なときに、引き続き取引のリストに追加する必要があることです。だから私のlastRenderedDeal
は、常に私のリストに追加された最後の取引を反映するように更新されます。
この反応は、表示されるobserver.observe
方法に渡されていません。それは私の最初の要素を取り上げるだけです。これはmounted
フックでインスタンス化されているので、これは明らかですが、どうすれば対処できますか?
取引のためのウォッチャーを設定し、observer.observeを再度呼び出す必要がありますか?もしそうなら、最初に観測されたアイテムを置き換えるように伝えることはできますか?
:' this.observer.observe(要素); '私はあなたのアプローチがもっと好きです。無限のスクロールロジックをそれ自身のコンポーネントに抽象化します。それを愛してください、あなたの助けに感謝します。 –
また、1ピクセルの高さスタイルを避ける方法もあります。私は['rootMargin'](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/rootMargin)で試してみましたが、それは助けになりません(確かに私はあまりにも頑張っていませんでした。誰かがそれについて修正案を提案できるかもしれない)。 –