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

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()
      }
    })
  })
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手动加好友太麻烦,想要自动加好友?

问&#xff1a;手上有一批客户数据&#xff0c;但每天手动添加很费时&#xff0c;而且还是多个微信号同时加好友&#xff0c;很容易出现数据重复加怕出错。有没有什么方法可以自动加好友呀&#xff0c;能支持多个号一起设置自动加好友&#xff0c;还可以设置定时启动任务操作的…

Linux docker 容器安装superset全部过程(superset docker版本)

解释一波 Apache Superset是一款由Python语言为主开发的开源时髦数据探索分析以及可视化的报表平台&#xff1b;她支持丰富的数据源&#xff0c;且拥有多姿多彩的可视化图表选择。 官网 &#xff1a;https://superset.apache.org/github &#xff1a;https://github.com/apache…

夜莺监控发布 v6.7 版本,推送部分商业版功能

熟悉夜莺的小伙伴都知道夜莺分为开源版、专业版、企业版&#xff0c;三个版本良性发展。近期夜莺团队发布了 v6.7 版本&#xff0c;把机器Metadata管理功能推送到了开源版&#xff0c;下面是该功能的简单介绍。 如上图&#xff0c;机器列表页面的机器标识部分&#xff0c;加了超…

RAG和AGI以及AIGC,你知道多少?

RAG&#xff08;Retrieval-Augmented Generation&#xff09;&#xff1a; RAG是一种模型架构&#xff0c;结合了检索&#xff08;retrieval&#xff09;和生成&#xff08;generation&#xff09;的方法。它使用检索模块从大规模的知识库中检索相关信息&#xff0c;然后使用生…

Linux:gcc的相关知识

目录 gcc的翻译&#xff08;编译&#xff09;过程&#xff1a; 预处理&#xff1a; 条件编译&#xff1a; 编译&#xff1a; 汇编&链接&#xff1a; 什么是链接&#xff1f; 安装静态库&#xff1a; 静态库的使用&#xff1a; 动态静态的对比&#xff1a; 优缺对比…

类和对象(友元、运算符重载、继承、多态)---C++

类和对象 4.友元4.1全局函数做友元4.2类做友元4.3成员函数做友元 5.运算符重载5.1 加号运算符重载5.1.1成员函数实现运算符重载5.1.2全局函数实现运算符重载 5.2 左移运算符重载5.2.1全局函数实现运算符重载5.2.2成员函数实现运算符重载 5.3 递增/递减运算符重载5.3.1 前置5.3.…

软件产品为什么要测试才能上线?测试可以发现所有bug吗?

在现如今信息时代&#xff0c;软件产品已经成为人们生活中不可或缺的一部分。无论是在工作中还是在娱乐休闲时&#xff0c;我们都需要依赖各种软件来完成各种任务。然而&#xff0c;你是否注意到了身边的软件产品都是经过严格的测试才能上线的呢?那么为什么软件产品必须要经过…

操作系统【OS】Ch2 进程同步与互斥机制

进程同步与互斥机制1&#xff1a;硬件和软件方法 硬件方法 也称为低级方法、元方法 不能实现让权等待 中断屏蔽 使用开/关中断指令实现简单高效只适用于单处理机只适用于操作系统内核进程【因为关中断的权力不能交给用户】 TestAndSet 实现简单适用于多处理机不满足让权等待…

【GAMES101】Lecture 09 重心坐标

我们之前说着色过程中以及这个计算法线的时候需要用到这个插值&#xff08;Interpolation&#xff09;&#xff0c;然后插值是通过这个重心坐标&#xff08;Barycentric Coordinates&#xff09;来实现的 目录 重心坐标 插值 重心坐标 注意哈我们这里说的三角形的重心坐标并…

RT-DETR优化改进:IoU系列篇 | Focaler-IoU​​​​​​​更加聚焦的IoU损失Focaler-IoU |2024年最新发表

🚀🚀🚀本文改进:Focaler-IoU更加聚焦的IoU损失Focaler-IoU,能够在不同的检测任务中聚焦不同的回归样本,使用线性区间映射的方法来重构IoU损失 🚀🚀🚀RT-DETR改进创新专栏:http://t.csdnimg.cn/vuQTz 🚀🚀🚀学姐带你学习YOLOv8,从入门到创新,轻轻松松搞…

(2024,强化学习,扩散,奖励函数)扩散模型的大规模强化学习

Large-scale Reinforcement Learning for Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1. 使用多步骤 MDP 的策略梯度 3.2. 基于分布的奖励函…

正则表达式初版

一、简介 REGEXP&#xff1a; Regular Expressions&#xff0c;由一类特殊字符及文本字符所编写的模式&#xff0c;其中有些字符&#xff08;元字符&#xff09;不表示字符字面意义&#xff0c;而表示控制或通配的功能&#xff0c;类似于增强版的通配符功能&#xff0c;但与通…

Docker部署

Docker简介 Docker是一个开源的容器引擎&#xff0c;它有助于更快地交付应用。 Docker可将应用程序和基础设施层隔离&#xff0c;并且能将基础设施当作程序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序&#xff0c;并可以缩短从编写到部署运行代码的周期。 &a…

数据结构奇妙旅程之二叉树题型解法总结

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

影响可变利差有几个因素,Anzo Capital先说两个

了解利差的变化规律&#xff0c;盈利赚钱还不是轻轻松松的事情&#xff0c;但Anzo Capital想问各位投资者&#xff0c;你们知道影响可变利差的价值有几个因素吗&#xff1f;今天就先抛砖引玉&#xff0c;先说两个影响可变利差的因素。 首先就是交易工具的流动性——商品快速买…

精通 VS 调试技巧,学习与工作效率翻倍!

​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ ​ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; ​ 所属专栏&#xff1a;C语言学习 ​ 贝蒂的主页&#xff1a;Betty‘s blog 1. 什么是调试 当我们写代码时候常常会遇见输出结果不符合我们预…

【三维重建】双目立体视觉

通过极几何可以求得极线&#xff0c;现在我们需要将左边的图变成右边的平行视图。 所有的极线都经过极点(e/e)&#xff0c;如果极点位于无穷远处&#xff0c;那所有的极线都平行。 (极几何的基础知识可以参考这篇文章&#xff1a;【三维重建】对极几何-CSDN博客) 平行视图中&…

modbus poll测试工具测试modbus tcp与PLC设备连接使用方法

socket默认端口是502&#xff0c;socket连上之后&#xff0c; 按照modbuspoll工具设置的读写参数 生成的RTU命令格式去组装读PLC的设备数据 modbuspoll工具配置&#xff0c;以v9.9.2中文破解版为例&#xff1a; 首先点连接菜单&#xff08;connection&#xff09;建立连接&…

基于springboot+vue的IT技术交流和分享平台系统(前后端分离)

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

【latex】在Overleaf的IEEE会议模板中,快速插入参考文献

【LaTeX】在Overleaf的IEEE会议模板中&#xff0c;快速插入参考文献 写在最前面第一步&#xff1a;在文献检索网站导出引用文献的bib文件第二步&#xff1a;编辑overleaf模版方法二&#xff1a;EduBirdie生成参考文献&#xff08;补充&#xff09;使用LaTeX在Overleaf的IEEE会议…