VUE 弹框内容懒加载-真实项目

背景:VUE 页面,点击按钮,弹框,内容从接口获取,数据量比较大,鼠标滑到页面最底部,调取一次接口,分批加载;

demo:

<template><div><!-- 触发弹框的按钮 --><el-button @click="dialogVisible = true">打开弹框</el-button><!-- 数据加载中的提示 --><el-loading v-if="loading" lock text="数据加载中,请稍候..."></el-loading><!-- 弹框 --><el-dialog:visible.sync="dialogVisible"title="大批量数据列表"@before-close="handleClose"><div class="data-list" ref="dataList" @scroll="handleScroll"><!-- 使用 v-for 渲染数据列表 --><div v-for="(item, index) in items" :key="index" class="data-item">{{ item }}</div></div><!-- 分页控件,点击加载更多 --><el-buttonslot="footer"size="small"@click="loadMore":disabled="loading">加载更多</el-button></el-dialog></div>
</template><script>
export default {data() {return {dialogVisible: false, // 控制弹框显示loading: false, // 数据加载中items: [], // 数据列表currentPage: 1, // 当前页码pageSize: 200, // 每页数据量hasMore: true, // 是否还有更多数据};},methods: {// 加载更多数据loadMore() {console.log("调取loadMore方法");if (!this.hasMore) return;this.loading = true;this.currentPage++;// 模拟从接口获取数据this.fetchData(this.currentPage, this.pageSize).then((data) => {this.items = this.items.concat(data);this.loading = false;// 判断是否还有更多数据if (data.length < this.pageSize) {this.hasMore = false;}}).catch((error) => {console.error("加载数据失败", error);this.loading = false;});},// 关闭弹框前的回调handleClose() {this.items = []; // 清空数据列表this.currentPage = 1;this.hasMore = true;this.loading = false; // 确保关闭弹框时停止加载},// 模拟获取数据的方法fetchData(page, pageSize) {return new Promise((resolve, reject) => {// 这里应该是调用你的 API 获取数据// 以下是一个模拟的数据响应示例const mockData = new Array(pageSize).fill(null).map((_, index) => `Item ${(page - 1) * pageSize + index + 1}`);setTimeout(() => {resolve(mockData);}, 1000);});},// 监听滚动事件,当滚动到底部时加载更多数据// handleScroll() {//   if (this.$refs.dataList && this.$refs.dataList.scroll) {//     const scrollContainer = this.$refs.dataList.scroll;//     if (//       scrollContainer.scrollTop + scrollContainer.clientHeight >=//       scrollContainer.scrollHeight - 10//     ) {//       this.loadMore();//     }//   }// },// 监听滚动事件,当滚动到底部时加载更多数据handleScroll(event) {// 获取滚动容器的引用const scrollContainer = event.target || this.$refs.dataList;// 确保 scrollContainer 是一个有效的 DOM 元素if (!scrollContainer) return;// 计算滚动位置const isAtBottom =scrollContainer.scrollTop + scrollContainer.clientHeight >=scrollContainer.scrollHeight - 10;// 只有在滚动到底部时才调用 loadMore 方法if (isAtBottom && this.hasMore) {console.log('zoujinqu')this.loadMore();}},},mounted() {// 监听滚动事件,当滚动到底部时加载更多数据// this.$refs.dataList.addEventListener('scroll', this.handleScroll);this.$nextTick(() => {if (this.$refs.dataList) {this.$refs.dataList.addEventListener("scroll", this.handleScroll);}});},beforeDestroy() {// 组件销毁前移除事件监听if (this.$refs.dataList) {this.$refs.dataList.removeEventListener("scroll", this.handleScroll);}},
};
</script><style scoped>
.data-list {max-height: 500px; /* 设置一个固定高度 */overflow-y: auto; /* 允许垂直滚动 */
}
.data-item {padding: 8px;border-bottom: 1px solid #eee;
}
</style>

真实项目:

接口是分页给的数据

<template><div><div style="position: relative; transition: all ease 0.5s"><el-table :data="defectList" style="width: 100%"><el-table-column prop="logFileName" label="日志信息" :show-overflow-tooltip="true" width="140"><template slot-scope="scope"><span class="color-list cursor" @click="logInfo(scope.row.logFileId)">{{ scope.row.logFileName }}</span></template></el-table-column></el-table></div><el-dialog title="日志详情" :visible.sync="dialogVisible" width="800px" :before-close="closeDialog"><div class="data-list" ref="dataList" @scroll="handleScroll"><div>{{ logDataInfo }}</div></div></el-dialog></div>
</template><script lang="ts">
import Vue from 'vue'
import { warn, downloadFetchFiles } from '@/utils/common'
import API from '@/api'
import { Base64 } from 'js-base64'export default Vue.extend({components: {},props: {defectList: {type: Array,default: () => []},total: {type: Number,default: 0},onPageChange: {type: Function,default: () => {}}},data() {return {selectedRow: null,dialogVisible: false,logDataInfo: '',loading: false,hasMore: true,currentPage: 1, // 当前页数pageSize: 50000 // 每页数量,}},mounted() {this.$nextTick(() => {if (this.$refs.dataList) {this.$refs.dataList.addEventListener('scroll', this.handleScroll)}})},methods: {logInfo(id: string) {localStorage.setItem('IDD', id)this.dialogVisible = truethis.loadMore()},// 加载数据async loadMore() {try {if (this.loading || !this.hasMore) return // 如果正在加载或没有更多数据了,则不再发送请求let id = localStorage.getItem('IDD')const response = await API.Defect.logDetailsData({page: this.currentPage,pageSize: this.pageSize,fileId: id})const data = Base64.decode(response.data.list)if (data) {this.logDataInfo = datathis.currentPage++ // 当前页数加一} else {this.hasMore = false // 没有更多数据了}} catch (error) {warn(error, true)}},// 监听滚动事件,当滚动到底部时加载更多数据handleScroll(event: any) {// 获取滚动容器的引用const scrollContainer = event.target || this.$refs.dataList// 确保 scrollContainer 是一个有效的 DOM 元素if (!scrollContainer) return// 计算滚动位置const isAtBottom = scrollContainer.scrollTop + scrollContainer.clientHeight >= scrollContainer.scrollHeight - 10if (isAtBottom && this.hasMore) {console.log('zoujinqu')this.loadMore()}},closeDialog() {this.dialogVisible = falsethis.dataList = []this.loading = falsethis.hasMore = truethis.currentPage = 1}},beforeDestroy() {// 组件销毁前移除事件监听if (this.$refs.dataList) {this.$refs.dataList.removeEventListener('scroll', this.handleScroll)}}
})
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/630612.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何部署npm私有仓库以及在项目中如何使用

如何部署npm私有仓库以及在项目中如何使用 为什么要部署npm私有仓库&#xff1f; 安全性&#xff1a;私有仓库允许团队存放内部研发的、不宜公开发布的代码包&#xff0c;只对特定用户或者团队可见和可用&#xff0c;从而保护公司的知识产权和商业秘密。模块的复用性&#xf…

HTML5+JavaScript实现本地视频/音频播放器

HTML5JavaScript实现本地视频/音频播放器 HTML5 提供了本地视频和音频播放器的支持&#xff0c;通过 <video> 和 <audio> 标签&#xff0c;这些标签支持多种媒体格式&#xff0c;并且可以通过 JavaScript 进行控制&#xff0c;实现功能比较完整的本地视频音频播放器…

Jenkins机器已经安装了ansible, 运行的时候却报错ansible: command not found

操作系统&#xff1a;MacOS Jenkins log提示 ansible: command not found 直接在Jenkins 机器中&#xff0c;进入一样的目录执行ansible --version OK 原因&#xff1a; Jenkins 默认使用的环境是 /usr/bin, 而我的ansible 安装配置在conda3 下面&#xff0c;所以需要在Jenkin…

Hive进阶

目录 一、MapReduce的计算过程 二、Yarn的资源调度 yarn的资源调度策略 三、Hive的语法树 四、Hive配置优化 五、数据开发 六、数据仓库 七、数据仓库开发流程 八、数仓分层 九、ETL和ELT 一、MapReduce的计算过程 分布式计算框架 需要编写代码执行&#xff0c;执行时…

云原生Kubernetes: K8S 1.29版本 部署Kuboard

目录 一、实验 1.环境 2.K8S 1.29版本 部署Kuboard (第一种方式) 3.K8S 1.29版本 部署Kuboard (第二种方式) 4.K8S 1.29版本 使用Kuboard 二、问题 1.docker如何在node节点间移动镜像 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注ma…

浅写个登录(无js文件)

全部代码如下&#xff0c;无需编写wxss文件&#xff0c;渲染都在style里面&#xff1a; <view style"height: 250rpx;width: 100%;"> <!-- 背景图片 --><view style"position: absolute; background-color: antiquewhite; height: 250rpx;width…

文件内容操作

文件内容操作 一:字节流1.1:InputStream1.1:构造方法:1.1.2:read()方法:1.1.3:关闭文件:close 1.2:OutputStream1.2.1:write() 二:字符流2.1:Reader2.2:Writer 一:字节流 字节流:以字节为单位读写数据. 常用的类主要有:InputStream,OutputStream 核心操作: (1)通过构造方法,打…

Tensorflow小技巧01:检测本地Tensorflow的版本

前言&#xff1a; 以Pycharm为例&#xff0c;Windwos10系统&#xff0c;检测本地环境的Tensorflow的版本&#xff1a; 1 打开Pycharm窗口 2 在窗口中输入&#xff1a; pythonPython 3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win…

实测52.4MB/s!全志T3+FPGA的CSI通信案例分享!

CSI总线介绍与优势 CSI&#xff08;CMOS sensor parallel interfaces&#xff09;总线是一种用于连接图像传感器和处理器的并行通信接口&#xff0c;应用于工业自动化、能源电力、智慧医疗等领域&#xff0c;CSI总线接口示意图如下所示&#xff08;以全志科技T3处理器的CSI0为…

怎么设置启用远程桌面? 如何让外网电脑远程本地内网?

如何远程控制电脑&#xff1f;最简单实用的方案是开启电脑系统自带的远程桌面功能&#xff0c;如果涉及跨网、内外网互通&#xff0c;可以同时用快解析内网映射外网。下面是方案的具体实施步骤&#xff0c;供大家参考。 怎么打开设置启用远程桌面&#xff1f; 1.在目标需要远…

全球排名前十的搜索引擎,你猜百度排名在第几位?bing稳居二位!

通常情况下&#xff0c;营销人员在争夺其在线业务的流量时会非常关注Google&#xff0c;无论是通过他们的网站&#xff0c;博客文章还是其他形式的内容。考虑到谷歌无疑是最受欢迎的搜索引擎&#xff0c;拥有超过85%的搜索市场份额&#xff0c;这是有道理的。 但这种受欢迎程度…

【云计算】云计算八股与云开发核心技术(虚拟化、分布式、容器化)

【云计算】云计算八股与云开发核心技术&#xff08;虚拟化、分布式、容器化&#xff09; 文章目录 一、什么是云计算&#xff1f;1、云计算的架构&#xff08;基础设施&#xff0c;平台&#xff0c;软件&#xff09;2、云计算的发展 二、如何做云计算开发&#xff1f;云计算的核…