van-list 遇到的问题

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

解决办法:

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

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

javascript 复制代码
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,
    };
}

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

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

javascript 复制代码
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;
  }
});

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

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

javascript 复制代码
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);
    });
  }
});

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

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

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

相关推荐
.Hypocritical.37 分钟前
数据结构笔记——链表成环/反转 + 有序二叉树(BST)构建、遍历、删除
java·数据结构
CSharp精选营5 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假8 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠9 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦16 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠17 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾17 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82117 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q17 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒17 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode