Vue 四行代码实现无感知上拉加载更多
话不多说,直接上代码:
//可滚动容器的高度
let innerHeight = document.querySelector('#app').clientHeight;
//屏幕尺寸高度
let outerHeight = document.documentElement.clientHeight;
//可滚动容器超出当前窗口显示范围的高度
let scrollTop = document.documentElement.scrollTop;
if (innerHeight < (outerHeight + scrollTop)) {
//加载更多操作
console.log("loadmore");
}
就这几行代码也没什么可说的,每个值在注释里面写的很清楚。
![](https://upload-images.jianshu.io/upload_images/6530889-8607a8542ea0fbce.gif?imageMogr2/auto-orient/strip|imageView2/2/w/270/format/webp)
接下来,从一张GIF图中来探寻上述几行代码是如何实现无感知上拉加载的:
![](https://upload-images.jianshu.io/upload_images/6530889-bfaa801432c87b3a.gif?imageMogr2/auto-orient/strip|imageView2/2/w/643/format/webp)
console中分别打印的是可滚动容器的高度innerHeight、屏幕尺寸的高度outerHeight、可滚动容器超出当前窗口显示范围的高度scrollTop。可以看到我选择的模拟器是iPhone5,屏幕高度568,这个值无论怎么滚动,都不会变。而scrollTop会随着滚动而增加,当滚动的底部无法再往下滚动时,这个数值停止增加,此时,innerHeight < (outerHeight + scrollTop),我们就可以使用这个条件进行上拉加载的操作了。
最后,献上完整代码(粘贴复制就能看到效果):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> <div id="app"> <p v-for="index in items">item{{ index }}</p> </div> <script> new Vue({ el: '#app', data: { items: 20 }, created() { window.addEventListener('scroll', this.onScroll); }, methods: { onScroll() { //可滚动容器的高度 let innerHeight = document.querySelector('#app').clientHeight; //屏幕尺寸高度 let outerHeight = document.documentElement.clientHeight; //可滚动容器超出当前窗口显示范围的高度 let scrollTop = document.documentElement.scrollTop; //scrollTop在页面为滚动时为0,开始滚动后,慢慢增加,滚动到页面底部时,出现innerHeight < (outerHeight + scrollTop)的情况,严格来讲,是接近底部。 console.log(innerHeight + " " + outerHeight + " " + scrollTop); if (innerHeight < (outerHeight + scrollTop)) { //加载更多操作 console.log("loadmore"); this.items += 10; } } } }) </script> </body> </html>
预见方能遇见。