当前位置: 首页 > news >正文

van-list 遇到的问题

将公司项目H5页面重构的时候,有一个类似购物车的页面,需要上拉加载,下拉刷新。使用的UI组件的是vant,其中看起来van-list 很符合基本需求,就果断进行了copy 修改。但是,在进行具体的业务交互的时候突然发现,看似满足需求的组件突然不符合要求了。下拉刷新直接使用van-pull-refresh就可以整个页面进行下拉刷新请求列表数据。这个是没有问题的,主要就出在van-list 的load方法,虽然滚动到底部加载更多以及必要的提示信息配置的很齐全,每次进入页面就触发load,对于进入编辑页面进行编辑后返回不是很友好,一般都是点击列表某一项进入编辑,返回列表更新数据,展示的视口最好是之前点击的是哪里现在就是哪里。van-list load方法进行阻断和调整都不是很顺利因此果断放弃。

解决办法:

首先实现加载更多这里推荐一下收藏的博主的地址 移动端上拉加载更多(vue3+vite+vant)_vue3 上拉加载更多-CSDN博客

这里封装的方法很是实用,完善过得那个没有使用明白,就单纯实用widow版本的。代码如下

import { onMounted, onUnmounted, ref } from "vue";export default function () {//页面是否滑动到最底部const isReachBottom = ref(false);//窗口滚动的距离const scrollTop = ref(0);//窗口可滚动的高度const scrollHeight = ref(0);// 监听窗口的滚动const scrollListener = () => {const clientHeight = document.documentElement.clientHeight;scrollTop.value = Math.floor(document.documentElement.scrollTop)scrollHeight.value = document.documentElement.scrollHeight;//窗口可滚动的高度    窗口滚动的距离+页面窗口的位置if (scrollHeight.value <= scrollTop.value + clientHeight + 1) {isReachBottom.value = true;}};//页面挂载添加监听onMounted(() => {window.addEventListener("scroll", scrollListener);});// 离开页面取消监听onUnmounted(() => {window.removeEventListener("scroll", scrollListener);});return {isReachBottom,scrollTop,scrollHeight,};
}

引入方式同原文   启用了两个监听事件  一个是判断是不是到底部  一个是获取当前滚动条高度。

监听到底部事件中,做了判断,

watch(isReachBottom, (newVal) => {if (newVal) {if (list.value.length > 0 && list.value.length >= total.value) {showToast("已经没有更多了");return false;}list.value.length < total.value && !loading.value && (page.value += 1);list.value.length < total.value && !loading.value && init(page.value);isReachBottom.value = false;}
});

这样可以保证页面不会无缘无故增加请求回来空数组了 也不会因为有一个请求过长就进行下一次请求了。

在点击编辑时记录当前分页和滚动条高度为了避免麻烦我进行了取整处理。页面路由守卫进行了处理只有是发现在列表页和编辑页来回跳转时不对缓存的页面信息和高度信息进行处理 其他路由会移除存储的页面和高度信息。

onMounted(async () => {const cachData = tool.data.get("cachData");if (!cachData) {init(1);} else {page.value = cachData.page;await refreshData();await nextTick(() => {window.scrollTo(0, cachData.height);});}
});

页面加载判断这里一开始犯了个错误就是缓存的高度一回来赋值给之前记录高度的变量导致滚动高度不对,后来点击多次发现滚动直接使用缓存高度就可以。这里最重要的是使用分页请求数据,加载更多是累加的所以

const refreshData = async () => {// 刷新数据时,获取所有相关页面的数据for (let i = 1; i <= page.value; i++) {await init(i);}
};

这样就实现了我需要的需求交互了,刚发现一个问题,滚动高度的计算在手机网页端需要减去导航栏的高度,不然上拉加载方法会失效!!!!

相关文章:

  • JavaScript 深拷贝和浅拷贝的实现、使用场景和存在的问题
  • 国产MCU芯片(2):东软MCU概览
  • 股指期货功能
  • Noisee AI – AI音乐影片MV在线生成工具,专门为Suno的好搭子来了~
  • 力扣 SQL题目
  • Memcached:内存缓存的强大引擎及其深度解析
  • java.nio.charset.UnmappableCharacterException
  • 16、架构-可观测性-事件日志详细解析
  • javaWeb项目-springboot+vue人事管理系统功能介绍
  • Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported
  • 3D ToF赋能小米CyberDog 2提升视觉灵敏度
  • 华为OD刷题C卷 - 每日刷题 23(提取字符串中的最长表达式,模拟目录管理功能 - 完整实现)
  • 解决Qt的multimedia库在clion中依赖库补全的问题
  • 认识Linux操作系统
  • 逢3必过报数游戏-第13届蓝桥杯省赛Python真题精选
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • (三)从jvm层面了解线程的启动和停止
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【mysql】环境安装、服务启动、密码设置
  • ➹使用webpack配置多页面应用(MPA)
  • Computed property XXX was assigned to but it has no setter
  • css系列之关于字体的事
  • egg(89)--egg之redis的发布和订阅
  • JS专题之继承
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Odoo domain写法及运用
  • ViewService——一种保证客户端与服务端同步的方法
  • Vue 动态创建 component
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 数据结构java版之冒泡排序及优化
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​什么是bug?bug的源头在哪里?
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • %check_box% in rails :coditions={:has_many , :through}
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (转)ABI是什么
  • (转载)CentOS查看系统信息|CentOS查看命令
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .net8.0与halcon编程环境构建
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .sh
  • /boot 内存空间不够
  • ::前边啥也没有
  • @EnableWebSecurity 注解的用途及适用场景
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构