页面内容太多会导致加载速度过慢,这时可考虑使用滚动加载即还没有出现在可视范围内的内容块先不加载,出现后再加载
基本思路就是判断元素是否出现在浏览器的可视区域,出现了就加载请求接口加载内容。但是要求内容块有最小高度。
具体代码如下


<template><div><divv-loading.fullscreen.lock="loading"class="page"id="tablist"@scroll="listScroll"><divclass="item"v-for="(item, i) in testData":key="i":class="i % 2 == 0 ? 'gray' : 'white'":id="item.id">{{ item.name }}</div></div></div>
</template><script>
export default {name: "ScrollLoadingSample",props: {},data() {return {flag: true, // 开关loading: false, // loading加载testData: [], // 列表数据targetIndex: 0,nextId: "",};},mounted() {this.initData();},methods: {initData() {this.testData = [{id: "test-1",name: "区块1",// 要加载的方法名function: "loadTest1",// 方法是否加载了isLoaded: false,},{id: "test-2",name: "区块2",function: "loadTest2",isLoaded: false,},{id: "test-3",name: "区块3",function: "loadTest3",isLoaded: false,},{id: "test-4",name: "区块4",function: "loadTest4",isLoaded: false,},{id: "test-5",name: "区块5",function: "loadTest5",isLoaded: false,},{id: "test-6",name: "区块6",function: "loadTest6",isLoaded: false,},];this.$nextTick(() => {this.loadPage();});},//判断元素是否在可视区域isElementInViewport(id) {let el = document.getElementById(id);//获取元素是否在可视区域let rect = el.getBoundingClientRect();return (rect.top + rect.height / 2 <=(window.innerHeight || document.documentElement.clientHeight) &&rect.bottom > 0);},// 初次加载页面时loadPage() {for (let i = 0; i < this.testData.length; i++) {if (this.isElementInViewport(this.testData[i]["id"])) {this.loadFunctionByName(this.testData[i]["function"]);this.testData[i]["isLoaded"] = true;} else {this.targetIndex = i;// 最开始没出现在页面上的idthis.nextId = this.testData[this.targetIndex]["id"];break;} }},// 页面滑动listScroll() {for (let i = this.targetIndex; i < this.testData.length; i++) {// 如果出现在页面上if (this.isElementInViewport(this.testData[i]["id"])) {// 如果方法没有加载if (!this.testData[i]["isLoaded"]) {this.loadFunctionByName(this.testData[i]["function"]);this.testData[i]["isLoaded"] = true;}} else {// 如果没有出现在页面上this.targetIndex = i;this.nextId = this.testData[this.targetIndex]["id"];break;}}},// 根据方法名加载loadFunctionByName(functionName) {switch (functionName) {case "loadTest1":this.loading = true;// 模拟延迟请求setTimeout(() => {console.log("加载区块1");this.loading = false;}, 1000);break;case "loadTest2":this.loading = true;// 模拟延迟请求setTimeout(() => {console.log("加载区块2");this.loading = false;}, 1000);break;case "loadTest3":this.loading = true;// 模拟延迟请求setTimeout(() => {console.log("加载区块3");this.loading = false;}, 1000);break;case "loadTest4":this.loading = true;// 模拟延迟请求setTimeout(() => {console.log("加载区块4");this.loading = false;}, 1000);break;case "loadTest5":this.loading = true;// 模拟延迟请求setTimeout(() => {console.log("加载区块5");this.loading = false;}, 1000);break;case "loadTest6":this.loading = true;// 模拟延迟请求setTimeout(() => {console.log("加载区块6");this.loading = false;}, 1000);break;}},},
};
</script><style scoped>
.page {width: 100vw;height: 100vh;overflow-y: auto;display: flex;flex-wrap: wrap;/* justify-content: center;align-items: center; */
}
.item {width: 100vw;height: 25vh;display: flex;justify-content: center;align-items: center;
}
.gray {background-color: #d5d1d1;
}
.white {background-color: white;
}
.loading {width: 80px;height: 100px;background: rgba(0, 0, 255, 0.664);display: inline-block;
}
</style>

需要注意 getBoundingClientRect()这个方法,正是通过这个方法获取元素位置,从而判断是否出现在可视区域

【vue】实现页面滚动加载相关推荐

  1. 【vue】用WOW.js+animate.css实现页面滚动加载元素动画

    一.场景 在很多的网站中,我们发现在滚动条滑动的时候一些元素显示出来的时候是有一些动画效果的,这样看起来页面更具有活力,增加用户体验.当然这些动画我们可以通过判断滚动条的位置或者判断元素距离可视窗口的 ...

  2. Vue刷新页面重新加载

    Vue刷新页面重新加载 问题描述 在加载同一路由页面的时候,vue的页面默认是不刷新的,需要重新加载数据 解决方案 修改App.vue 在路由视图上添加一个变量isRouterAlive判断显示实现重 ...

  3. vue页面滚动加载、页面懒加载

    需求:页面有一堆图表.需要滚动到图表时.再加载出来这个图表. 思路:没找到合适的插件.只能自己手撸一个.直接放到混入里就行.主要就是判断元素距离底部的距离和可视区域内容的高度进行对比即可 /*** 判 ...

  4. Vue向下滚动加载更多数据-scroll-案例

    vue-infinite-scroll 安装 npm install vue-infinite-scroll --save 尽管官方也推荐了几种载入方式,但"最vue"的方式肯定是 ...

  5. 页面滚动加载动画之WoW.js

    https://www.delac.io/wow/官网 https://github.com/matthieua/WOW 下载地址 当网页的向下滚动的时候,有些元素会产生细小的动画效果.然而直接用an ...

  6. Angular\Vue解决页面数据加载时出现{{message}}闪烁的情况

    vue 使用v-cloak <style type="text/css">[v-cloak] { display: none } </style> < ...

  7. vue 滑动加载列表 php,通过原生vue添加滚动加载更多功能

    这篇文章主要介绍了通过原生vue添加滚动加载更多功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 vue中添加滚动加载更多,因为是单页面所以需要在 ...

  8. 前端vue里面点击加载更多_vue 原生添加滚动加载更多

    vue中添加滚动加载更多,因为是单页面所以需要在跳出页面时候销毁滚动,要不会出现错乱.我们在mounted建立滚动,destroyed销毁滚动. mounted () { window.addEven ...

  9. Vue踩坑之旅(四)—— 自定义指令实现滚动加载

    这几天在做商城首页的商品列表,商品卡片的数量很多,如果一次性加载那么多,加载较慢,而且用户体验不好.所以使用鼠标无限滚动加载效果更好. 实现滚动加载的方式有很多,有现成的组件 InfiniteScro ...

最新文章

  1. ie旋转滤镜Matrix
  2. android 字符串函数,Android JNI开发系列(六)字符串操作
  3. docker history 27f1068ca9da --no-trunc查看镜像dockerfile内容
  4. hssfworkbook 单元格合并后宽度不生效_Excel表格“假”合并,有多牛?
  5. python3 并行计算_Python-并行计算
  6. 【华为出品】物联网全栈开发实战营第2期来啦!送海思开发板
  7. duino例程 stm32_stm32duino
  8. Visual Studio 2019 for Mac 8.3 正式发布
  9. 「双11」哪些东西值得买?超值大礼包四舍五入等于不要钱
  10. IIS主机头值的意思
  11. Car Net全文翻译
  12. 华为od机考真题-平安果
  13. docker参数详解
  14. 【Python】绘制GPX轨迹图并定位特定时间点
  15. istqb纸质证书_关于istqb证书有效期的阿里云论坛用户知识和技术交流
  16. 微信付费群如何创建?如何搭建教程九块九源码?
  17. 两个offer:rovi和凯捷中国,不知道如何选择
  18. p2p打洞之nat分类
  19. centos使用yum命令安装报错 File /usr/bin/yum, line 30 except KeyboardInterrupt, e:
  20. 前端工程师必备九大网站

热门文章

  1. C#怎样处理一个panel的显示隐藏
  2. linux oops问题调试
  3. 关于constexpr与const
  4. Halcon三维测量(2):三维点云模型三角化+切片处理+边缘宽度测量
  5. Java获取对象的内存地址
  6. Unity实现简单AR功能
  7. Linux下MySQL数据库乱码 Linux下MySQL修改默认字符集
  8. 珠海行(下)--不会游泳的潜水员(2)
  9. 【软件测试】单元测试工具---Junit详解
  10. 软件设计师教程(五)计算机系统知识-数据结构