纯前端实现上一条下一条切换,并实现跨页切换上一条下一条

news2024/11/16 19:35:47
1.开发遇到了新的需求:再进入到视频播放界面,需要支持可以点击上一条下一条按钮,实现数据切换的功能
2.功能开发的理解

在这里插入图片描述

需要考虑到以上的需求,
1.由于视频的入口不一致,要根据入口的不同,实现不同的上一条下一条
2.当数据发现跨页跳转的时候,需要调用和请求不同的接口
3.当数据发生跨页的时候,返回列表的时候,需要回到跨页后的列表
3.开发思路
首先,开发之前思路一定很重要,要先理清楚思路,再进行开发。(上一条下一条统称为跨条)
1,如何进行跨条切换,并且在筛选过后,要按照筛选的条件来进行跨条:在每次调用数据的时候,将里面的请求参数,列表的数据,全部储存到sessionStorage中,免得进入详情页后,刷新页面跨条失败的情况,然后在详情页通过findIndex参数,找到他在哪里
2.判断是否发生跨页,跨页后就发送相关请求,参数从sessionStorage里面获取。

4.开始开发

1.只有在用户点击的时候,再对数据进行存储,因为这里涉及到返回的时候,要取sessionStorage内的值。
点击的时候调用接口请求参数,并存储,传递false表示要存储 initTable(false)
const initTable = (isClear = true) => {
  if (sessionStorage.getItem('nextOrPrev')) {
    tableData.value.current = JSON.parse(sessionStorage.getItem('nextOrPrev'))?.filterList.currentPage
  }
  Api.send(ApiConfig.EVIDENCELIST, {
    currentPage: tableData.value.current,
    pageSize: tableData.value.pageSize,
    sortName: sort.sortName,
    sortOrder: sort.sortOrder,
    ...props.searchForm,
    iconTypes:iconTypes
  }).then((res) => {
    if (res.data.status == 0 && res.data.msg == "success") {
      if (!isClear) {
        const filterList = {
          currentPage: tableData.value.current,
          pageSize: tableData.value.pageSize,
          sortName: sort.sortName,
          sortOrder: sort.sortOrder,
          ...props.searchForm,
          iconTypes: iconTypes
        }
        const total = {
          total:res.data.data.totalCount
        }
        const type = {
          type:'evidence'
        }
        sesionPrevOrNext(res.data.data.list,filterList,total,type)
      }
    }
  }).finally(() =>{
    route.name === 'evidence' && isClear && sessionStorage.removeItem('nextOrPrev')
  });
};
sesionPrevOrNext是封装的函数
// 证据上一页下一页方法封装
export const sesionPrevOrNext = (lists,filterLists,totals,types) => {
  const eviIdList = lists.map(item => (
    {
      id:item.evidenceId || item.id,
      accessClass:item.accessClass,
      viewStatus:item.viewStatus
    }
  ))
  const filterList = filterLists
  const total = totals
  const type = types
  sessionStorage.setItem('nextOrPrev',JSON.stringify({
    eviIdList,
    filterList,
    total,
    type
  }))
}
进入详情后,切换,这是按钮
<div>
  <a-button :disabled="forbidPrev" @click="goPrevOrNext(false)">
    <icon-left />
    上一条
  </a-button>
  <a-button :disabled="forbidNext" @click="goPrevOrNext(true)">
    下一条
    <icon-right />
  </a-button>
</div>
4.判断
// 去上一个证据或者去下一个证据
const forbidPrev = ref(false)
const forbidNext = ref(false)

// 获取证据数据并禁用相关按钮  getEviInfoList接口的调用,等详情页数据获取成功后再调用,否则可能会去不到实时的值,因为有延迟
const getEviInfoList = () => {
  const { eviIdList,filterList,total } = JSON.parse(sessionStorage.getItem('nextOrPrev')) 
  const index = eviIdList.findIndex(item => item.id === route.query.id)

  // 当证据所处为第一页的第一个证据时,应该禁用上一页
  if (filterList.currentPage == 1 && index === 0) {
    forbidPrev.value = true
  }else{
    forbidPrev.value = false
  }
  // 计算他是否是最后一页的最后一个证据,禁用下一页
  const curEviCount = index + 1 + filterList.pageSize * (filterList.currentPage - 1)
  // 计算是否为最后一页的最后一个属性证据
  if (curEviCount===total.total) {
    forbidNext.value = true
  }else{
    forbidNext.value = false
  }
  
  // 请求数据 满足以下条件后,才对跨页数据进行数据请求
  let requestPrevData = index === 0 && filterList.currentPage !== 1
  let requestNextData = index + 1 === filterList.pageSize && curEviCount !== total.total

  return { eviIdList,filterList,requestPrevData,requestNextData,index }
}
5.跳转
const goPrevOrNext = async (flag: boolean) => {
  const { eviIdList,filterList,requestPrevData,requestNextData,index } = getEviInfoList()
  if (flag) {
      // 当下一个证据有跨页,请求新的数据
    if (requestNextData) {
      // 下一页取他的第一个证据
      filterList.currentPage = filterList.currentPage + 1
      //等待数据请求完成之后,再执行以下代码逻辑
      const res = await initTable(filterList)
      if (res === 0) {
        // 及时更新eviIdList,filterList数据 否则会取到未更新的sessionStorage数据
        const { eviIdList } = JSON.parse(sessionStorage.getItem('nextOrPrev'))
        //跨页后的第一个
        gotoDetail(eviIdList[0])
      }
    }else{
      gotoDetail(eviIdList[index + 1])
    }
  } else {
    // 当上一个证据有跨页,请求新的数据
    if (requestPrevData) {
      // 前一页应倒过来
      let prevNum = null
      filterList.currentPage = filterList.currentPage - 1
      const res = await initTable(filterList)
      if (res === 0) {
        const { eviIdList, filterList } = JSON.parse(sessionStorage.getItem('nextOrPrev'))
        prevNum = filterList.pageSize - 1
        gotoDetail(eviIdList[prevNum])
      }
    }else{
      gotoDetail(eviIdList[index - 1])
    }
  }
  console.log(index, flag, route.query.id, JSON.parse(sessionStorage.getItem('nextOrPrev')))
}

5.1跳转不同,这里可能涉及到不同的入口,他的跳转方式不同,所有通过这个来控制
const gotoDetail = (record) => {
  const { type } = JSON.parse(sessionStorage.getItem('nextOrPrev'))
  if(type.type === 'evidence' || type.type === 'folderEvi'){
    myAndAlleviGo(record)
  }else if(type.type === 'myShare' || type.type === 'othersShare'){
    shareMeOrOtherGo(record)
  }else if(type.type === 'deleteEvi'){
    deleteEviGo(record)
  }
};
const myAndAlleviGo = (record) => {
  if (
    (record.accessClass == 1 && PERMMAP["dem:eems:evidence:viewEvidence:unrestricted"]) ||
    (record.accessClass == 2 && PERMMAP["dem:eems:evidence:viewEvidence:restricted"]) ||
    (record.accessClass == 3 && PERMMAP["dem:eems:evidence:viewEvidence:confidential"])
  ) {
    if (record.viewStatus) {
      router.replace({
        name: "evidenceDetail",
        params: record.id,
        query: {
          id: record.id,
          accessClass: record.accessClass
        }
      });
    } else if (!record.viewStatus) {
      _this.$message.error($t('evidence.mapIndex.requestAccess'));
    }
  } else {
    if (!record.viewStatus) {
      _this.$message.error($t('evidence.mapIndex.requestAccess'));
    } else {
      _this.$message.error($t('evidence.mapIndex.requestAccess'));
    }
  }
}

const shareMeOrOtherGo = (record) => {
  router.replace({
    name: "evidenceDetail",
    params: record.id,
    query: {
      pageFlag:'share',
      id: record.id
    }
  });
};

const deleteEviGo = (record) => {
  router.replace({
    name: "evidenceDetail",
    params: record.id,
    query: {
      id: record.id,
      accessClass: record.accessClass,
      isDelete: 1
    }
  })
}

6.跨页获取数据

// 跨页获取数据
const initTable = (filterLists) => {
  const { type:Types } = JSON.parse(sessionStorage.getItem('nextOrPrev'))

  // 将异步操作封装成 Promise 对象
  return new Promise((resolve, reject) => {
    //书写映射,避免重复的if判断
    const requestApi = {
        "evidence":ApiConfig.EVIDENCELIST,
        'myShare':ApiConfig.GETSHAREEVIDENCEFROMME,
        'othersShare':ApiConfig.GETSHAREEVIDENCETOME,
        'deleteEvi':ApiConfig.EVIDENCELIST,
        'folderEvi':ApiConfig.QUERYFOLDEREVI
    }
    Api.send(requestApi[Types.type], filterLists).then((res) => {
      if (res.data.status == 0) {
        const filterList = filterLists
        const total = {
          total: res.data.data.totalCount
        }
        const type = {
          type:Types.type
        }
        sesionPrevOrNext(res.data.data.list,filterList,total,type)
        // 异步操作完成后调用 resolve 函数
        resolve(res.data.status)
      } else {
        // 如果异步操作出错,则调用 reject 函数
        reject()
      }
    })
  })
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue 的 事件修饰符and按键修饰符

1、事件修饰符概览 修饰符说明 .prevent阻止默认事件 .stop阻止冒泡.once事件只触发一次 .capture 添加事件侦听器时使用事件捕获模式.self只有点击当前元素本身时才会触发回调.passive事件的默认行为立即执行&#xff0c;无需等待事件回调执行完毕(不常用).native 将vue组件…

Qt 拖拽事件示例

一、引子 拖拽这个动作,在桌面应用程序中是非常实用和具有很友好的交互体验的。我们常见的譬如有,将文件拖拽到某个窗口打开,或者拖拽文件到指定位置上传;在绘图软件中,选中某个模板、并拖拽到画布上,画布上变回绘制该模板的图像… 诸如此类,数不胜数。 那么,在Qt中我…

学习笔记-李沐动手学深度学习(一)(01-07,概述、数据操作、tensor操作、数学基础、自动求导)

个人随笔 第三列是 jupyter记事本 官方github上啥都有&#xff08;代码、jupyter记事本、胶片&#xff09; https://github.com/d2l-ai 多体会 【梯度指向的是值变化最大的方向】 符号 维度 &#xff08;弹幕说&#xff09;2&#xff0c;3&#xff0c;4越后面维度越低 4…

Java线程池七大参数详解和配置(面试重点!!!)

一、corePoolSize核心线程数 二、maximunPoolSize最大线程数 三、keepAliveTime空闲线程存活时间 四、unit空闲线程存活时间的单位 五、workQueue线程工作队列 1、ArrayBlockingQueue FIFO有界阻塞队列 2、LinkedBlockingQueue FIFO无限队列 3、PriorityBlockingQueue V…

电池回收产业东风中,吉利科技集团如何先行一步?

随着绿色低碳可持续发展理念深入人心&#xff0c;全球能源变革和转型升级持续推进&#xff0c;新能源行业不断涌现新的机遇。 动力电池回收和再利用&#xff0c;就是近在眼前的“红利型”产业。 我国新能源汽车市场近年来爆发式增长&#xff0c;动力电池生产紧随电动车普及步…

Elasticsearch分布式一致性原理剖析(三)-Data篇

本文首发于云栖社区(Elasticsearch分布式一致性原理剖析(三)-Data篇-博客-云栖社区-阿里云)&#xff0c;由原作者转载。 前言 “Elasticsearch分布式一致性原理剖析”系列将会对Elasticsearch的分布式一致性原理进行详细的剖析&#xff0c;介绍其实现方式、原理以及其存在的问…

OceanBase创建租户

租户是集群之上的递进概念&#xff0c;OceanBase 数据库采用了多租户架构。 集群偏部署层面的物理概念&#xff0c;是 Zone 和节点的集合&#xff0c;租户则偏向于资源层面的逻辑概念&#xff0c;是在物理节点上划分的资源单元&#xff0c;可以指定其资源规格&#xff0c;包括…

常见的二十种软件测试方法详解

一.单元测试&#xff08;模块测试&#xff09; 单元测试是对软件组成单元进行测试。其目的是检验软件组成单位的正确性。测试对象是&#xff1a;模块。 对模块进行测试&#xff0c;单独的一个模块测试&#xff0c;属于静态测试的一类 测试阶段&#xff1a;编码后或者编码前&…

大数据学习之Redis、从零基础到入门(一)

目录 一、Redis入门概述 1. 是什么&#xff1f; 官方解释&#xff1a; 2. 能干嘛&#xff1f; 2.1 主流功能与应用 2.1.1分布式缓存 2.1.2内存存储和持久化(RDBAOF) 2.1.3高可用架构搭建 2.1.4缓存穿透、击穿、雪崩 2.1.5分布式锁 2.1.6队列 2.2 总体功能概括 2.3…

JeecgBoot 3.6.1实现Modal对话框,以为审核数据为例

JeecgBoot 3.6.1实现Modal对话框 vue使用的是3.0版本 文章目录 JeecgBoot 3.6.1实现Modal对话框前言一、列表页面关键代码示例二、textAuditModal.vue代码示例三、test.api.ts总结 前言 在工作中&#xff0c;有一个需求&#xff0c;要求&#xff0c;在数据列表页&#xff0c;…

容联云入选中国大模型产业新锐企业TOP30

近日&#xff0c; WIM 2023&#xff08;世界创新者年会&#xff09;发布《2023中国大模型产业创新服务商TOP 30》名单&#xff0c;评选出30家2023年中国大模型领域做出卓越贡献的企业&#xff0c;凭借垂直行业大模型“赤兔大模型”展现出的创新力与商业落地速度&#xff0c;容联…

springboot项目中使用iframe引入页面

一、 <iframe name"uploadPage" src"/uploadImg.html" width"100%" height"50" marginheight"0" marginwidth"0" scrolling"no" frameborder"0"></iframe> 前提是将要引入的页面…

2012-2022年全国各省数字经济相关指标数据合集(18个指标)

2012-2022年全国各省数字经济相关指标数据合集&#xff08;18个指标&#xff09; 1、时间&#xff1a;2012-2022年 2、指标&#xff1a;地区、year、互联网接入端口数、互联网宽带接入用户数、互联网域名数、移动电话普及率、长途光缆线路长度&#xff08;万公里&#xff09;…

Linux 文件:IO接口详解及实操

一、C语言中的文件IO读写操作 在c语言文件中&#xff0c;创建、打开、读、写操作可以通过如下的代码进行&#xff1a; 1.1写文件 通过w指令对文件进行写入操作时&#xff0c;编译器会先将文件内容清空然后重新写入。 #include <stdio.h> #include <string.h> i…

山体滑坡监测预警系统-gnss位移监测站

GNSS山体滑坡位移监测站是一种利用全球导航卫星系统&#xff08;GNSS&#xff09;进行山体滑坡位移监测的设备。它通过接收和处理GNSS卫星信号&#xff0c;能够实时监测山体的位移变化&#xff0c;并将数据传输到后端系统进行分析和处理。 GNSS山体滑坡位移监测站具有高精度、…

基于springboot+vue的师生健康信息管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

java web mvc-03-JFinal

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails JFinal JFinal 是基于 Java 语言的极…

CSC7225

CSC7225 为高性能电流模式 PWM 开关电源控制器&#xff0c;满足绿色环保标准&#xff1b;广泛适用于经济型开关电源&#xff0c;如 DVD、机顶盒、传真机、打印机、LCD 显示器等。CSC7225 采用 DIP-8 封装。 CSC7225主要特点  CSC7225内置 700V 高压功率开关管&#xff0c;外…

kubeadm 安装k8s集群后,master节点notready问题解决方案

使用kubeadm 安装k8s集群后&#xff0c;加载calico cni 网络组件后&#xff0c;master节点notready问题 表现为&#xff1a; 使用命令查看日志&#xff1a;journalctl -f -u kubelet 报错如下&#xff1a; Failed to start ContainerManager failed to initialize top level…

通过代理服务器的方式解决跨域问题

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈 这里以本地访问https://heimahr.itheima.net/api/sys/permission接口为列子 Node.js 代理服务器 (server.js) 本次考虑使用JSONP或CORS代理来…