vue3接口、数据懒加载,回滚不重复加载

目标:实现当组件进入可视区域在加载数据或者发送请求。

背景:父组件为vxe-table构成的组件、子组件为table的某一列,这一列的数据通过接口返回,有多少条表格数据就会请求多少次接口,为了提升性能,所以采用接口懒加载,但是需要在回滚的时候不重复请求或者加载数据

  • 使用 @vueuse/core 中的 useIntersectionObserver 来实现监听进入可视区域行为,但是必须配合vue3.0的组合API的方式才能实现。
  • 对某个板块进行数据懒加载,首先要获取到这个dom元素,然后用useIntersectionObserver来监听这个dom,一旦可视区进入了这个dom元素这里,就可以进行请求数据接口
  • 安装@vueuse/core包,它封装了一些常见的交互逻辑
  • 通过状态机保存在列表上已经加载过了的数据,并打上已经加载过了的标签:isLaded:rue,回滚时就对比传入子组件的row数据的id与存入状态机的数据是否有id相同的一条,并查看是否 已存在isLoaded

npm i @vueuse/core@4.9.0

步骤:

  • 理解 useIntersectionObserver 的使用,各个参数的含义
  • 封装 useLazyData 函数,作为数据懒加载公用函数
  • 把 index.vue页面里数据改造成懒加载方式

页面准备:

src/hook.ts存放懒加载逻辑的函数

import { useIntersectionObserver } from '@vueuse/core'
import { ref } from 'vue'/*** 用于懒加载数据* @param {*} apiFn 懒加载数据的接口* @returns target: 需要绑定的DOM对象  result: 结果数据*/
export const useLazyData = (apiFn: Function) => {const target = ref(null)const result = ref()let stopObserver // 保存观察者的停止函数const { stop } = useIntersectionObserver(target, ([{ isIntersecting }], observerElement) => {if (isIntersecting) {stopObserver() // 调用之前保存的停止函数apiFn().then((data) => {if (data) {result.value = data}})}})stopObserver = stop // 保存观察者的停止函数return { target, result,stopObserver }
}

在状态机中定义好状态机的一切

  [RootMutations.LOADED_TEST_DATA](state: RootState, value) {state.loadedTestData = value},

子组件:绑定target,使用懒加载

<section ref="target"><span>{{ newData?.end_time }}</span></section>
import { defaultProps } from './props'const props = defineProps(defaultProps)
const emits = defineEmits(['update'])
const { modelValue, endTime } = toRefs(props)const newData: Ref<App.BatteryTest> = ref(unref(modelValue))
//封装接口请求
const getDeadline = () => {
.test(参数, {//逻辑代码}).then(([res]) => {if (res?.status === 200) {nextTick(() => {newData.value = { ...unref(newData), end_time: dateFormat(res?.data?.Deadline / 1000) + '' }emits('update', unref(newData))updateLoadedData() //更新已经加载的数据    })return dateFormat(res?.data?.Deadline / 1000) + ''//这里返回给hook中定义的useLazyData中的result}else {nextTick(() => {newData.value = { ...unref(newData), end_time: '' }emits('update', unref(newData))updateLoadedData() //更新已经加载的数据})return ''}
})function dateFormat(date: any) {//转变导出报表记录日期格式if (date == undefined || date == 0) {return ''}return moment(date * 1000).format('YYYY-MM-DD HH:mm:ss')
}//更新已经加载的数据isLoaded: true,存入状态机
function updateLoadedData() {let bbarr = cloneDeep(store.state.loadedTestData)bbarr.push({ ...unref(newData), isLoaded: true })store.commit('LOADED_TEST_DATA',bbarr)
}const { target, result, stopObserver } = useLazyData(getDeadline)
//监听穿入子组件的props数据
watch(modelValue,newValue => {let originArr = cloneDeep(store.state.loadedTestData)if (originArr.length > 0) {// 停止观察已经加载的节点const hasSameId = originArr.some(item => item.id === unref(modelValue)?.id && item.isLoaded)if (hasSameId) {stopObserver()const item = originArr.find(item => item.id === unref(modelValue)?.id && item.isLoaded)newData.value.end_time = formateEndTime(item.end_time)//重新赋值为原来的数据} } },{ deep: true, immediate: true }
)

父组件:
 

            <vxe-column:key="index"v-bind.sync="column":field="column.prop":title="column.label"width="item.minWidth"show-overflow:formatter="column.prop === 'test_state' ? formatTestState : null":sortable="column.prop !== 'end_time'"v-if="column.checked"><template v-else-if="column.prop === 'end_time'" #default="{ row }"><!-- <battary-loading :end-time="row.end_time" :model-value.sync="row" :class="[endTimeClass, endTimeBreathLight(row.end_time)]"></battary-loading> --><battary-loading :end-time="row.end_time" :model-value.sync="row" @update="getTableRow"></battary-loading></template><vxe-column/>//在nMounted里面重置为[]onMounted(() => {store.commit('LOADED_TEST_DATA',[])
})
//如果有分页,可在分页事件中将OADED_TEST_DATA重新置为空数组

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

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

相关文章

《开箱元宇宙》:认识香港麦当劳通过 The Sandbox McNuggets Land 的 Web3 成功经验

McNuggets Land 是 The Sandbox 于 2023 年发布的最受欢迎的体验之一。在本期的《开箱元宇宙》系列中&#xff0c;我们采访了香港麦当劳数位顾客体验暨合作伙伴资深总监 Kai Tsang&#xff0c;来了解这一成功案例背后的策略。 在不断发展的市场营销和品牌推广领域&#xff0c;不…

Visual Studio 2022 + OpenCV 4.5.2 安装与配置教程

目录 OpenCV的下载与配置Visual Studio 2022的配置新建工程新建文件新建项目属性表环境配置测试先写一个输出将OpenCV的动态链接库添加到项目的 x64 | Debug下测试配置效果 Other OpenCV的下载与配置 参考这个OpenCV的下载与环境变量的配置&#xff1a; Windows10CLionOpenCV4…

网络原理---拿捏HTTP协议:请求和响应

文章目录 认识请求首行URLURL的格式URL的encode和decode 版本号方法GET方法POST方法GET VS POST 请求头&#xff1a;headerHostContent-Length 和 Content-TypeUser-Agent&#xff08;UA&#xff09;RefererCookie 空行正文&#xff1a;body如何构造HTTP请求&#xff1f;浏览器…

ARMday04(开发版简介、LED点灯)

开发版简介 开发板为stm32MP157AAA,附加一个拓展版 硬件相关基础知识 PCB PCB&#xff08; Printed Circuit Board&#xff09;&#xff0c;中文名称为印制电路板&#xff0c;又称印刷线路板&#xff0c;是重要的电子部件&#xff0c;是电子元器件的支撑体&#xff0c;是电子…

Linux生成随机密码和根据密码批量生成用户

cat /dev/urandom|tr -dc [:alnum:]|head -c20 生成20位数字字母的随机密码。 /dev/urandom生成随机数&#xff0c;tr -dc [:alnum:] 保留所有数字和字母&#xff0c;head -c20保留前20位。 使用原生的Linux命令生成可以说是极度安全的&#xff0c;也适用于批量用户生成的情况…

Django中如何让DRF的接口针对前后台返回不同的字段

在Django中&#xff0c;使用Django Rest Framework&#xff08;DRF&#xff09;时&#xff0c;可以通过序列化器&#xff08;Serializer&#xff09;和视图&#xff08;View&#xff09;的组合来实现前后台返回不同的字段。这通常是因为前后台对数据的需求不同&#xff0c;或者…

AlphaControls控件TsRadioGroup的使用

通常使用AlphaControls控件中的TsRadioGroup时&#xff0c;往往使用默认值&#xff0c;会造成TsRadioGroup标题被TsRadioGroup的ITEMs占用&#xff0c;严重影响美观&#xff1a; 解决方案&#xff0c;通过对TsRadioGroup的ContentVOffset属性&#xff0c;设置为10。即可立即改善…

处理uniapp打包后有广告的问题

1、登录平台&#xff08;开发者中心&#xff09; 2、 3、 4、 5、

3线硬件SPI+DMA驱动 HX8347 TFT屏-快速显示文字

本文实现DMA快速显示文字 汉字点阵通常是16*16点阵&#xff0c;那么用DMA一次性显示汉字&#xff0c;应该至少申请480*16个字节的空间&#xff0c;用于显示一行文字&#xff0c;其中480是屏幕一行用DMA驱动所需内存。 一、 源码 HX8347.h #ifndef USER_HX8347_H_ #define USE…

回归预测 | Matlab实现PCA-PLS主成分降维结合偏最小二乘回归预测

回归预测 | Matlab实现PCA-PLS主成分降维结合偏最小二乘回归预测 目录 回归预测 | Matlab实现PCA-PLS主成分降维结合偏最小二乘回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现PCA-PLS主成分降维结合偏小二乘回归预测&#xff08;完整源码和数据) 1.输…

2023年9月少儿编程 中国电子学会图形化编程等级考试Scratch编程二级真题解析(选择题)

2023年9月scratch编程等级考试二级真题 选择题(共25题,每题2分,共50分) 1、点击绿旗,运行程序后,舞台上的图形是 A、画笔粗细为4的三角形 B、画笔粗细为5的六边形 C、画笔粗细为4的六角形 D、画笔粗细为5的三角形 答案:D 考点分析:考查积木综合使用,重点考查画笔…

伪造referer [极客大挑战 2019]Http1

打开题目 没有发现什么&#xff0c;我们查看源代码 在这里我们发现了提示 访问一下页面得到 提示说不能来自于https://Sycsecret.buuoj.cn&#xff0c;我们尝试访问一下这个url 发现访问不了 我们bp抓包一下 伪造个referer头 referer:https://Sycsecret.buuoj.cn 发包过去…

【js逆向实战】某sakura动漫视频逆向

写在前面 再写一个逆向实战&#xff0c;后面写点爬虫程序来实现一下。 网站简介与逆向目标 经典的一个视频网站&#xff0c;大多数视频网站走的是M3U8协议&#xff0c;就是一个分段传输&#xff0c;其实这里就有两个分支。 通过传统的m3u8协议&#xff0c;我们可以直接进行分…

如何申请QQ邮箱的SMTP密钥简洁版

QQ 邮箱的 SMTP 密钥通常称为"SMTP 授权码"&#xff0c;你可以按照以下步骤找到它&#xff1a; 1.登录 QQ 邮箱&#xff1a;打开 QQ 邮箱登录页面&#xff0c;并使用你的 QQ 账号和密码登录。 2.进入设置页面&#xff1a;在 QQ 邮箱页面中&#xff0c;点击顶部的&q…

MySQL篇之mysql主从集群搭建

一、MySQL集群架构的介绍 我们在使用MySQL数据库的时候&#xff0c;只是一个单机的数据库服务。在实际的生产环境中&#xff0c;数据量可能会非常庞大&#xff0c;这样单机服务的MySQL在使用的时候&#xff0c;性能会受到影响。并且单机的数据安全想也会受到影响。因此在生产黄…

制作一个模板三

您已经看到了Jinja2在呈现过程中如何用实际值替换占位符&#xff0c;但这只是Jinja2在模板文件中支持的众多强大操作之一。例如&#xff0c;模板还支持在{%…%}块。下一个版本的index.html模板增加了一个条件语句: app/templates/index.html: <!doctype html> <htm…

快速开发一个简单实用的MES系统?

题主在一个光伏组件工厂做生产管理&#xff0c;但工厂竟然没有MES系统&#xff0c;于是想自己开发一个简单的MES系统。那么我们来看看题主对于开发MES系统的要求—— 对系统&#xff1a;每一个产品都有一个条形码&#xff0c;希望系统可以追踪生产计划下的产品的生产状态&…

RPA在财务预测和分析中的应用

在现代企业管理中&#xff0c;财务数据分析是决策制定和战略规划的关键环节。大数据的兴起带来财务数据的复杂性和数量不断增加&#xff0c;企业为此消耗了大量人力和物力。随着当今数字化、智能化时代的到来&#xff0c;越来越多企业引进RPA技术来提高工作效率&#xff0c;实现…

LeetCode算法心得——全排列(回溯型排列)

大家好&#xff0c;我是晴天学长&#xff0c;排列型的回溯&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按…

JVM垃圾回收机制

JVM 可达性分析法 1. 垃圾回收器的基本概念 什么是垃圾回收器&#xff1a;JVM 为 Java 提供了垃圾回收机制&#xff0c;其实是一种偏自动的内存管理机制。简单来说&#xff0c;垃圾回收器会自动追踪所有正在使用的对象&#xff0c;并将其余未被使用的对象标记为垃圾&#xff…