vueで@scrollを使用してスクロールイベントをリスニングする
11872 ワード
転載先:https://blog.csdn.net/qq449736038/article/details/80769507
vueでスクロールバーをスライドさせて下にロードします.
vueのscrollイベント
トップページをオンデマンドでロードするときにスクロールバーをスクロールしてからロードします
Windowsにバインドされている場合、ルーティング切り替え後もイベントがトリガーされるため、div要素にバインドされます.
(windowにバインドされている場合は、ナビゲーションガードでルーティングが離れたときにバインドを解除すればいいので、同じように機能を実現できます)
上記のように、私のliラベルが十分に多くても、ページがいっぱいで、ページがスクロールしている間にscrollEventをトリガーできないことに気づきました.何が原因ですか.
よく考えてみると、スクロールイベントは私のdivでトリガーされたわけではないと思います.スクロールバーは私のdivに現れていないからです.このdivは完全にliラベルに支えられており、スクロールイベントを生み出すのはdocumentです.
そこで小さな実験を行い、固定高さのdivを定義しました.
この300 px固定高さのdivでスクロールすると、やはりscrollEventがトリガーされ、問題の原因が見つかり、次は解決しました.
一定の高さを持つことができれば、スクロールイベントをトリガーすることができます.
しかし、固定高さはどのように与えるのか、メーカーごとに携帯電話の画面の高さが異なり、一部の携帯電話の表示が不完全になったり、底に空白を残したりすることはできないでしょう.
もちろん方法がある!html、body、.私のですbody-containerはdocumentの高さに継承できます.
もう一つの方法があります.body-container fixedを使用した位置決め
上下左右の位置が固定されているのでdivも自然に固定高さがあり、この方法はページに固定高さのヘッドナビゲーションがあり、私のプロジェクトには6 remの高さのヘッドナビゲーションがあるのでfixed位置決めを採用しました.
次に、底に滑ったかどうかを確認します.
これにより、底まで転がっているかどうかをより明確に判断できます.しかし、このように書くだけでは、底部100 px内をスクロールすると、複数回のロードがトリガーされるため、判断条件を追加する必要がある
これで、機能は完璧に実現し、documentは使用されなかった.addEventListenerはvueの完全性を破壊する
vueでスクロールバーをスライドさせて下にロードします.
vueのscrollイベント
トップページをオンデマンドでロードするときにスクロールバーをスクロールしてからロードします
Windowsにバインドされている場合、ルーティング切り替え後もイベントがトリガーされるため、div要素にバインドされます.
(windowにバインドされている場合は、ナビゲーションガードでルーティングが離れたときにバインドを解除すればいいので、同じように機能を実現できます)
<template>
<div class="body-container" @scroll="scrollEvent">
<ul>
<li></li>
……
<li></li>
</ul>
</div>
<template>
export default {
name: 'demo',
data () {
return {
msg: '',
}
},
methods: {
scrollEvent(e){
console.log(e)
},
}
}
上記のように、私のliラベルが十分に多くても、ページがいっぱいで、ページがスクロールしている間にscrollEventをトリガーできないことに気づきました.何が原因ですか.
よく考えてみると、スクロールイベントは私のdivでトリガーされたわけではないと思います.スクロールバーは私のdivに現れていないからです.このdivは完全にliラベルに支えられており、スクロールイベントを生み出すのはdocumentです.
そこで小さな実験を行い、固定高さのdivを定義しました.
<div style="height: 300px" @scroll="scrollEvent">
<div style="height: 200px"></div>
<div style="height: 200px"></div>
<div style="height: 200px"></div>
</div>
この300 px固定高さのdivでスクロールすると、やはりscrollEventがトリガーされ、問題の原因が見つかり、次は解決しました.
一定の高さを持つことができれば、スクロールイベントをトリガーすることができます.
しかし、固定高さはどのように与えるのか、メーカーごとに携帯電話の画面の高さが異なり、一部の携帯電話の表示が不完全になったり、底に空白を残したりすることはできないでしょう.
もちろん方法がある!html、body、.私のですbody-containerはdocumentの高さに継承できます.
html,body{
height:100%
}
.home-test{
height: 100%
overflow-y: scroll // ?
}
もう一つの方法があります.body-container fixedを使用した位置決め
.body-container{
position: fixed;
top:6rem;
left: 0;
right:0;
bottom: 0;
overflow: auto
}
上下左右の位置が固定されているのでdivも自然に固定高さがあり、この方法はページに固定高さのヘッドナビゲーションがあり、私のプロジェクトには6 remの高さのヘッドナビゲーションがあるのでfixed位置決めを採用しました.
次に、底に滑ったかどうかを確認します.
export default {
name: 'demo',
data () {
return {
msg: '',
}
},
methods: {
scrollEvent(e){
// + > -100
if(e.srcElement.scrollTop+e.srcElement.offsetHeight>e.srcElement.scrollHeight-100){
this.loadMore(); //
}
},
}
}
これにより、底まで転がっているかどうかをより明確に判断できます.しかし、このように書くだけでは、底部100 px内をスクロールすると、複数回のロードがトリガーされるため、判断条件を追加する必要がある
methods: {
scrollEvent(e){
console.log(e) // e ,
// !this.moreLoading , , this.moreLoading true
// !this.noMore false, 1 , , this.noMore true,
if(e.srcElement.scrollTop+e.srcElement.offsetHeight>e.srcElement.scrollHeight-100 && !this.moreLoading && !this.noMore){
this.loadMore();
}
},
}
これで、機能は完璧に実現し、documentは使用されなかった.addEventListenerはvueの完全性を破壊する