vue3解决切换tab页每次切换加载数据导致数据缓慢问题

const tabchange=e=>{
data.activity = e
vedioLoad(data.activity)//加载数据 加载的时候传值过去
}

解决方法:
使用标识符来进行辨认 有两个tab页 搞个动态加载 在开头的vedioload还没开始加载的时候判断是否加载过 入股已经加载过 则返回 不要重新加载

loadvideos会根据loadedTabs的状态决定是否需要加载数据

改动

videos.value = filterSelectData 改为videos.value[videoTypeFilter] = filterSelectData;

由标签页的离线和在线数据 都分开管理 使用两个列表:即一个数组两个对象进行存储 数组的下标有tab0 tab1 动态决定 代替原来的直接覆盖数据
在这里插入图片描述

const loadVideos = (videoTypeFilter) => {if (loadedTabs.value[videoTypeFilter]) {// 如果数据已经加载过了,直接返回data.loading = false;return;}// 数据尚未加载,执行加载逻辑// ...加载数据的代码...loadedTabs.value[videoTypeFilter] = true; // 数据加载完成后,设置为true
}const tabsChange = e => {data.activeKey = e;loadVideos(data.activeKey); // 调用loadVideos来加载数据
};

单页全部代码

<!-- 宣传教育 --><template><div class="video-section"><div class="box-header block-interval"><div class="title"><a-tabs v-model:activeKey="activeKey" @change="tabsChange"><a-tab-pane key=1 tab="在线" /><a-tab-pane key=0 tab="离线" /></a-tabs></div></div><div class="backcolor"><div class="search-bar"><!-- 搜索 --><a-form-item label="视频课程:"><a-input v-model:value="where.videoTitle" placeholder="请搜索视频课程" allow-clear /></a-form-item><a-button type="primary" @click="reload" class="searchBtn"><img src="@/assets/icon/archives/select.png" alt="" class="searchIcon" />查询</a-button></div><a-spin :spinning="loading"><div class="video-gallery"><div v-for="video in videosForCurrentTab" :key="video.id"><div class="video-container"><video :id="`video-${video.id}`" controls muted class="video-player"><source :src="video.fileUrl" type="video/mp4" /></video></div><div class="video-item-wrapper"><div class="video-title">{{ video.videoTitle }}</div></div></div></div></a-spin><div class="pagination-style"><a-pagination :current="currentPage" :pageSize="pageSize" :total="total" @change="handlePageChange"@showSizeChange="handlePageSizeChange" /></div></div></div>
</template><script >
import { sysFileUploadUrl, previewFile } from '@/api/file/FileApi';
import { defineComponent, reactive, toRefs, onMounted, h, getCurrentInstance } from 'vue';
import { ref, computed } from 'vue';
import router from '@/router';
import { Modal, message } from 'ant-design-vue';
import { EducationApi } from '@/api/education/educationApi';export default defineComponent({setup() {const videos = ref([]);const loadedTabs = ref({});//加载const loadVideos = (videoTypeFilter) => {data.loading =true;// 检查是否已加载该标签页的数据if (loadedTabs.value[videoTypeFilter]) {data.loading =false;return; // 如果已加载,直接返回}let result = EducationApi.getEducationListPage({videoType: videoTypeFilter,pageNo: data.currentPage,pageSize: data.pageSize,});result.then(result => {data.total = result.data.totalRowslet filterSelectData = result.data.rows.map(video => ({ ...video, selected: false }));if (videoTypeFilter == 0) {//调用处理路径的方法filterSelectData = filterSelectData.map(video => {if (video.fileId && video.fileId.trim() !== '') {video.fileUrl = `http://172.24.8.11:9062/upms/sysFileInfo/publicDownload?fileId=${video.fileId}`;}return video})}// videos.value = filterSelectData;videos.value[videoTypeFilter] = filterSelectData;loadedTabs.value[videoTypeFilter] = true;debuggerdata.loading =false;})}const data = reactive({where: {},selection: [],activeKey: "1",id: 0,currentPage: 1,pageSize: 8, // 每页显示的条数total: 20, // 总数据量,需要从后端获取loading:false,})const tabsChange = e => {data.activeKey = e;loadVideos(data.activeKey)};onMounted(() => {//在线视频loadVideos(1)});const reload = () => {let result = EducationApi.getEducationList({ videoTitle: data.where.videoTitle, videoType: data.activeKey });result.then(res => {videos.value = res.data;})}//分页加载数据const handlePageChange = newPage => {data.currentPage = newPage;loadVideos(data.activeKey); // 重新加载数据};//更改每页显示的数据量const handlePageSizeChange = (current, size) => {data.pageSize = size;loadVideos(data.activeKey); // 重新加载数据};// 添加const add = () => {router.push('/edu/eduAdd');};const gotoDetail = (id) => {router.push(`/edu/eduAdd?id=${id}`);};//删除idconst getSelectedVideoIds = () => {console.log("getSelectedVideoIds" + JSON.stringify(videos.value));return videos.value.filter(video => video.selected).map(video => video.id);};//删除const del = item => {let messages = null;let params = { ids: [] };const selectedVideoIds = getSelectedVideoIds();if (selectedVideoIds.length === 0) {return message.warning('请选择删除项');}messages = `是否要删除选中的【${selectedVideoIds.length}条】的视频?`Modal.confirm({title: h('div', {}, messages),okText: '确定',cancelText: '取消',closable: true,onOk: () => {data.loading =true;EducationApi.delEducation(selectedVideoIds).then(res => {message.success('删除成功');loadVideos(data.activeKey)});}});};return {...toRefs(data),videos,add,del,gotoDetail,reload,tabsChange,previewFile,handlePageChange,handlePageSizeChange,videosForCurrentTab: computed(() => videos.value[data.activeKey] || []),// ...其他返回的属性或方法};}
})</script><style lang="scss" scoped>
/* 样式保持不变 */
.ant-tabs {width: 100%;margin-top: -20px;
}.backcolor {background: #fff;height: 100%;
}.video-section {background-color: #e7f1fb !important;}.box-header {background: #fff;height: 60px;display: flex;justify-content: space-between;align-items: center;padding: 0 20px;.title {color: #333333;padding: 20px 20px;border-left: 4px solid #007cf0;height: 5px;}.title-right {display: flex;width: 200px;justify-content: space-between;}
}.search-bar {display: flex;gap: 10px;justify-content: flex-end;padding: 20px 20px;
}.video-gallery {display: grid;grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));/* 使每个视频元素至少300px宽,同时填满可用空间 */gap: 1rem;padding: 1rem;flex-grow: 1;
}.video-container {background-color: black;position: relative;padding-top: 56.25%;/* 16:9宽高比 */
}.video-player {position: absolute;top: 0;left: 0;width: 100%;height: 100%;
}.video-item-wrapper {display: flex;align-items: center;justify-content: center;.video-checkbox {margin-right: 10px;}.video-title {text-align: center;margin-top: 0.5rem;cursor: pointer;}}.pagination-style {display: flex;justify-content: center;margin-top: 20px;
}/* 媒体查询,针对较小屏幕调整布局 */
@media (max-width: 800px) {.video-gallery {grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));/* 在较小屏幕上,减小视频元素的最小宽度 */}
}
</style>

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

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

相关文章

Sonarqube安装(Docker)

一&#xff0c;拉取相关镜像并运行 # 拉取sonarqube镜像 docker pull sonarqube:9.1.0-community在运行之前要提前安装postgres并允许&#xff0c;新建数据库名为sonar的数据库 Docker安装postgres教程 docker run -d --name sonarqube --restartalways \ -p 19000:9000 \ …

英飞凌AURIX 2G TC3xx新一代芯片架构系列介绍-概论

英飞凌AURIX 2G TC3xx新一代芯片架构系列介绍-概论

SSM的校园二手交易平台----计算机毕业设计

项目介绍 本次设计的是一个校园二手交易平台&#xff08;C2C&#xff09;&#xff0c;C2C指个人与个人之间的电子商务&#xff0c;买家可以查看所有卖家发布的商品&#xff0c;并且根据分类进行商品过滤&#xff0c;也可以根据站内搜索引擎进行商品的查询&#xff0c;并且与卖…

Grafana UI 入门使用

最近项目上需要使用Grafana来做chart&#xff0c;因为server不是我在搭建&#xff0c;所以就不介绍怎么搭建grafana server&#xff0c;而是谈下怎么在UI上具体操作使用了。 DOCs 首先呢&#xff0c;贴一下官网doc的连接&#xff0c;方便查询 Grafana open source documenta…

git提交操作(不包含初始化仓库)

1.进入到本地的git仓库 查看状态 git status 如果你之前有没有成功的提交&#xff0c;直接看第5步。 2.追踪文件 git add . 不要提交大于100M的文件&#xff0c;如果有&#xff0c;看第5步 3.提交评论 git commit -m "你想添加的评论" 4.push (push之前可以再…

基于ssm西安旅游管理系统论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对西安旅游信息管理的提升&#x…

卷积神经网络相关知识点

梯度下降算法 写的都很好&#xff0c;第一个看不懂可以接着看第二个&#xff0c;第二个里面有复现代码&#xff0c;第三篇是一篇综述&#xff0c;进阶阶段可以看。 详解梯度下降算法https://blog.csdn.net/JaysonWong/article/details/119818497线性回归模型——梯度下降算法…

认真学SQL——MySQL入门之环境准备

一.认识mysql数据库 1.1数据库概述 数据库概念: 存储数据的仓库,本质是一个文件系统 1.2数据库分类: 关系型数据库: 必须遵循SQL规范,强调以二维表格的形式存储数据 举例: MySQL ORACLE DB2 SqlServer SQLite 非关系型数据: NoSQL不仅仅是SQL,强调以key-value形…

【Proteus仿真】【STM32单片机】超声波测距系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用动态数码管、按键、HCSR04超声波、蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示超声波检测距离&#xff0c;当检测…

Canvas保姆级教程----深入解析HTML5 Canvas工作原理和常用方法

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

simulink代码生成(十)——eQEP模块

1 光电编码器的测速原理 光电编码器是一种通过光学或者光电子传感器来检测物体位置、速度或者运动方向的装置。它的测速原理基于光电效应和编码技术&#xff0c;通常包含一个光源、光电传感器和旋转或移动的编码盘。 光源&#xff1a; 光电编码器中通常包含一个光源&#xff0…

用户输入分数, 根据分数奖励不同的车( 利用多分支语句 )

90~100 分 奖励法拉利 80~90 分 奖励奥迪 60~80 分 奖励奥拓 60 分以下 打一顿 <script>const numprompt(请输入一个分数)if(num>90){alert(恭喜你喜提法拉利)}else if(num>80){alert(恭喜你喜提奥迪)}else if(num>60){alert(奖励奥拓)}else{alert(打一顿…