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

长列表局部渲染(监听window滚动),wndonw滚动同理

场景

后端一股脑给了几千个数据,我们滚动过程永远只渲染20条

原理

滚动到底时候获取裁剪位置,的到需要渲染的20条数据,通过vue diff算法更新到dom

代码

<template>
  <div class="container" @scroll="handleScroll">
    <div v-if="showRefreshHint" class="refresh-hint">下拉刷新...</div>
    <ul>
      <li v-for="(item, index) in visibleItems" :key="index" class="item">
        {{ item }}
      </li>
    </ul>
    <div v-if="loadingMore" class="loading">加载中...</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      longArray: Array.from({ length: 1000 }, (_, i) => `Item ${i + 1}`), // 长数组
      visibleCount: 20, // 当前可见的条目数
      loadingMore: false, // 是否正在加载更多
      showRefreshHint: false, // 是否显示刷新提示
      lastScrollTop: 0, // 上一次的滚动位置
    };
  },
  computed: {
    visibleItems() {
      return this.longArray.slice(0, this.visibleCount);
    },
  },
  methods: {
    handleScroll(event) {
      const container = event.target;
      const { scrollTop, scrollHeight, clientHeight } = container;

      // 判断是否滚动到底部
      if (scrollTop + clientHeight >= scrollHeight - 10) {
        this.loadMore();
      }

      // 判断是否滚动到顶部
      if (scrollTop <= 0) {
        this.showRefreshHint = true;
        this.refreshData();
      } else {
        this.showRefreshHint = false;
      }

      // 保存当前滚动位置
      this.lastScrollTop = scrollTop;
    },
    loadMore() {
      if (this.loadingMore) return; // 防止重复加载
     // this.loadingMore = true;

      // 模拟异步加载
     // setTimeout(() => {
        this.visibleCount += 20; // 每次加载更多条目
        this.loadingMore = false;
      //}, 1000);
    },
    refreshData() {
      // 模拟刷新数据
     // setTimeout(() => {
        this.visibleCount = 20; // 重置可见条目数
        this.showRefreshHint = false; // 隐藏刷新提示
     // }, 1000);
    },
  },
};
</script>

<style>
.container {
  height: 100vh;
  overflow-y: auto;
  position: relative;
  background:#f3f2f2;
}
ul{
  padding:0;
}
.refresh-hint {
  text-align: center;
  padding: 10px;
  background-color: #f0f0f0;
  position: sticky;
  top: 0;
  z-index: 10;
}
.loading {
  text-align: center;
  padding: 10px;
  background-color: #f0f0f0;
}
.item {
  height: 60px;
  display: flex;
  align-items: center;
  padding: 0 10px;
  background:#fff;
}
.item +.item{
  margin-top:10px;
}
</style>

在线地址:

Vue SFC Playground

http://www.dtcms.com/a/83026.html

相关文章:

  • Learn:C++ Primer Plus Chapter13
  • ChainLit快速接入DeepSeek实现一个深度推理的网站应用图文教程-附完整代码
  • Swift 并发任务的协作式取消
  • Mysql 安装教程和Workbench的安装教程以及workbench的菜单栏汉化
  • Python 常用内建模块-itertools
  • HTML(超文本标记语言)
  • Python FastApi(2):基础使用
  • 【SpringBoot】MorningBox小程序的完整后端接口文档
  • 第3章 Internet主机与网络枚举(网络安全评估)
  • Python 爬取 1688 详情接口数据返回说明
  • Mysql架构理论部分
  • github代理 | 快速clone项目
  • 简单理解机器学习中top_k、top_p、temperature三个参数的作用
  • 前端开发:Vue以及Vue的路由
  • AsyncHttpClient使用说明书
  • Android Compose 切换按钮深度剖析:从源码到实践(六)
  • SpringBoot @Scheduled注解详解
  • SQL宏-代替UDF
  • JSONPath 的介绍
  • 搭建主从DNS、nfs、nginx
  • 【MySQL】undo日志页结构
  • 智能遥感新质生产力暨DeepSeek、Python、OpenCV驱动的空天地数据识别与计算及15个行业标杆案例
  • linux 之 查看进程运行时长
  • C# SerialPort 使用详解
  • Linux中修改文件的权限用什么命令?
  • 前端项目完结--上线打包发布步骤和方法
  • MySQL 中,查看执行频次、慢查询日志、SHOW PROFILE和 EXPLAIN性能分析和优化
  • 可视化图解算法:删除链表中倒数第n个节点
  • 在 Linux 系统中,路径(Path)用于定位文件或目录的位置。路径分为两种类型:相对路径和绝对路径。它们的核心区别在于路径的起点不同
  • 枚举的定义及其使用