Vue 3 表格时间监控与动态后端请求触发详解(附Demo)

news/2024/12/22 9:48:18/

目录

  • 1. 基本知识
  • 2. Demo

1. 基本知识

这一类的时间点是因数据而异,所以定时任务不适用,需要前端表格自身数据到达之后去触发

往下的数据多数结合自身实战代码的一个总结

  1. 表格数据渲染

在 Vue 3 中使用 el-table 组件来展示表格数据,表格中的每一行数据通过列组件 el-table-column 来指定展示的内容
在表格中通过 prop 绑定数据字段,label 用于展示列的名称

<el-table :data="tableData"><el-table-column label="还柜时间" prop="appointmentEndTime" /><el-table-column label="操作" />
</el-table>

tableData 是一个数组或对象类型的数据源,表格会根据 prop 属性将数据展示到表格列中

  1. 时间格式化与校准
    前端场景中,经常需要格式化时间来便于展示或进行逻辑判断

比如Date 对象的 getTime() 方法获取时间戳,用于比较某一时间点是否到达

const currentTime = new Date().getTime() // 获取当前时间的时间戳
const appointmentTime = new Date(item.appointmentEndTime).getTime() // 获取预约时间的时间戳

这有助于处理时间相关的业务逻辑,比如:在到达某个时间点时触发某种操作

  1. 异步 API 请求
    在时间到达时,通过前端代码自动触发后端 API 请求

在 Vue 3 中,常见的异步请求是使用 async/await.then/.catch 来处理请求的成功和失败

await GoodsStoragePlanApi.deleteGoodsStoragePlan(item.id).then(response => { console.log("成功处理请求") }).catch(error => { console.error("请求失败") })

这个场景适合动态删除数据库中的数据,或是其他需要时间精确触发的操作

  1. 定时器与实时监控
    使用 setInterval 方法可以实现定时任务,会每隔指定的时间执行一次回调函数

这个方法常用于实时检查某些条件是否满足,例如检查表格中某个时间是否已经到达当前时间

setInterval(() => {checkAppointmentTimes() // 每秒检查一次
}, 1000)

通过这种方式可以实现实时监控某个数据的变化,达到特定条件时,自动触发相关操作

  1. 条件判断与防止多次请求
    为避免多次触发请求,必须明确条件
    通常会检查某个数据是否为空,或时间差是否符合条件

例如:当 appointmentEndTime 不为 null 且时间差在 1 秒内时,触发请求 (时间上用等于不合适,因为毫秒级别很难会以等于作判定)

if (appointmentTime - currentTime <= 1000 && appointmentTime >= currentTime) {// 触发后端请求
}

2. Demo

以下的Demo和逻辑比较通用!

Demo 1: 删除过期预约 (自身实战代码)

场景: 自动删除超过还柜时间的预约

  • 表格渲染:通过 el-table 渲染表格,展示每一行的预约时间
  • 时间检查:每秒检查表格中的时间列,当到达还柜时间时,自动删除对应数据
<template><el-table :data="Object.values(tableData)"><el-table-column label="还柜时间" prop="appointmentEndTime" /><el-table-column label="操作" /></el-table>
</template><script setup>javascript">
import { ref, onMounted } from 'vue'
import { GoodsStoragePlanApi } from '@/api'const tableData = ref({data1: { id: 1, appointmentEndTime: '2024-09-21 15:00:00' },data2: { id: 2, appointmentEndTime: '2024-09-21 16:00:00' }
})const checkAppointmentTimes = async () => {const currentTime = new Date().getTime()Object.values(tableData.value).forEach(async (item) => {if (item.appointmentEndTime) {const appointmentTime = new Date(item.appointmentEndTime).getTime()if (appointmentTime - currentTime <= 1000 && appointmentTime >= currentTime) {await GoodsStoragePlanApi.deleteGoodsStoragePlan(item.id)}}})
}onMounted(() => {setInterval(() => {checkAppointmentTimes()}, 1000)
})
</script>

Demo 2: 即将到期商品提醒

场景: 在商品即将到期时发送提醒请求

  • 时间逻辑:这里将检查时间差设置为 1 小时(3600000 毫秒),即只有在商品到期时间的一小时内才会触发提醒请求
  • 后端请求:当时间满足条件时,触发提醒请求,向用户发送即将到期的通知
<template><el-table :data="Object.values(productList)"><el-table-column label="到期时间" prop="expirationTime" /><el-table-column label="操作" /></el-table>
</template><script setup>javascript">
import { ref, onMounted } from 'vue'
import { ProductApi } from '@/api'const productList = ref({product1: { id: 101, expirationTime: '2024-10-01 18:00:00' },product2: { id: 102, expirationTime: '2024-10-02 12:00:00' }
})const checkExpirationTimes = async () => {const currentTime = new Date().getTime()Object.values(productList.value).forEach(async (item) => {if (item.expirationTime) {const expirationTime = new Date(item.expirationTime).getTime()if (expirationTime - currentTime <= 3600000 && expirationTime >= currentTime) { // 1小时内await ProductApi.sendReminder(item.id)}}})
}onMounted(() => {setInterval(() => {checkExpirationTimes()}, 60000) // 每分钟检查一次
})
</script>

Demo 3: 会议提醒系统

场景: 自动提醒用户即将开始的会议

  • 逻辑设定:会议开始前 10 分钟发送提醒,通过 setInterval 每分钟检查会议列表
  • API 触发:当时间差小于 10 分钟时,通过 API 发送提醒
<template><el-table :data="Object.values(meetingList)"><el-table-column label="会议开始时间" prop="meetingStartTime" /><el-table-column label="操作" /></el-table>
</template><script setup>javascript">
import { ref, onMounted } from 'vue'
import { MeetingApi } from '@/api'const meetingList = ref({meeting1: { id: 201, meetingStartTime: '2024-09-25 09:00:00' },meeting2: { id: 202, meetingStartTime: '2024-09-26 11:00:00' }
})const checkMeetingTimes = async () => {const currentTime = new Date().getTime()Object.values(meetingList.value).forEach(async (item) => {if (item.meetingStartTime) {const meetingTime = new Date(item.meetingStartTime).getTime()if (meetingTime - currentTime <= 600000 && meetingTime >= currentTime) { // 10分钟内await MeetingApi.sendMeetingReminder(item.id)}}})
}onMounted(() => {setInterval(() => {checkMeetingTimes()}, 60000) // 每分钟检查一次
})
</script>

http://www.ppmy.cn/news/1530699.html

相关文章

谷歌 Chrome 最新版升级:更强的安全检查功能守护你的上网安全

谷歌 Chrome 浏览器产品经理 Andrew Kamau 在最新发布的博文中宣布&#xff0c;Chrome 浏览器迎来了新一轮的安全升级。新版 Chrome 在后台自动运行安全检查功能&#xff0c;采取了额外的主动措施来保障用户的安全。 自动撤销通知权限 新版 Chrome 浏览器采用了一项基于谷歌安…

Stable Diffusion 优秀博客转载

初版论文地址&#xff1a;https://arxiv.org/pdf/2112.10752 主要流程图&#xff1a; Latent Diffusion Models&#xff08;LDMs&#xff09; DDPM是"Denoising Diffusion Probabilistic Models"的缩写&#xff0c; 去噪扩散概率模型 博客&#xff1a; 【论文阅读…

WebGL纹理与材质

目录 理解纹理理解材质纹理映射高级纹理技术实现材质系统纹理坐标和纹理坐标的生成纹理映射模式纹

Spring:项目中的统一异常处理和自定义异常

介绍异常的处理方式。在项目中&#xff0c;都会进行自定义异常&#xff0c;并且都是需要配合统一结果返回进行使用。 1.背景引入 &#xff08;1&#xff09;背景介绍 为什么要处理异常&#xff1f;如果不处理项目中的异常信息&#xff0c;前端访问我们后端就是显示访问失败的…

C++入门day4-面向对象编程(下)

前言&#xff1a;C入门day3-面向对象编程&#xff08;中&#xff09;-CSDN博客 初识&#xff1a;继承特性 继承的基础语法 class A{ public:int a; }; class B:public A { public:int b; }; B类通过继承A类后&#xff0c;内部会继承一个int变量 a&#xff1a;从下图我们可以…

Java 14Java 15新特性概述

一、Java 14 发布于2020年3月17日。Java 14主要新特性如下&#xff1a; JEP 305&#xff1a;Pattern Matching for instanceof (Preview)instanceof 的模式匹配&#xff08;预览&#xff09; JEP 358&#xff1a;Helpful NullPointerExceptions 有用的 NullPointerExceptions…

应用DFX能力介绍

一、HarmonyOS生态DFX能力范围 围绕开发者&#xff0c;构建三方应用和设备从开发到维护全生命周期所必需、有竞争力、有特色的调试调优、定位、维护能力。 二、HarmonyOS DFX能力全集 三、DFX设计主要范围 1、HiLog 日志分类 日志常用命令 日志级别 日志规则 2、HiAppEvent 完…

Llama 3.2来了,多模态且开源!AR眼镜黄仁勋首批体验,Quest 3S头显价格低到离谱

如果说 OpenAI 的 ChatGPT 拉开了「百模大战」的序幕&#xff0c;那 Meta 的 Ray-Ban Meta 智能眼镜无疑是触发「百镜大战」的导火索。自去年 9 月在 Meta Connect 2023 开发者大会上首次亮相&#xff0c;短短数月&#xff0c;Ray-Ban Meta 就突破百万销量&#xff0c;不仅让马…