vue3 图片/视频 加载失败重试

vue3 图片/视频 加载失败重试

需求背景

用户手机上传图片走oss ,在pc端在线客服连接socket
需要实时推送消息,接受到消息后,由于oss还回没有回调成功,所以图片/视频不能及时展示,所以做了一个失败重试的功能

效果图

在这里插入图片描述

技术方案

  1. 服务端接收到oss的回调,再给客户端发送一条消息,告诉回调成功了,但是前端存在一定滞后性
  2. 前端通过媒体组件提供的error事件,做回调监听,当前你可以一直监听,也可以做loadNumber次数限制

代码实现

<!-- 媒体组件 可以用于聊天气泡/工单媒体数据展示 --><template><div v-if="!pathIsMp4(props.msg)" :style="{ width: props.width + 'px', height: props.height + 'px' }"><el-imagev-if="isLoaded":src="imgUrl.src"fit="cover":preview-src-list="[imgUrl.src]":zoom-rate="1.2":max-scale="7":min-scale="0.5"lazy><template #error><div>{{ $t('common_loading_error') }}</div></template></el-image><div v-else >{{ $t('common_loading') }}...</div></div><div v-else :style="{ width: props.width + 'px', height: props.height + 'px' }"><video ref="videoRefs" controls :src="imgUrl.src" @error="handleError">Your browser does not support the video tag.</video></div>
</template>
<script lang="ts" setup>
import { ref, reactive, onMounted, onBeforeUnmount } from 'vue'
import { pathIsMp4 } from 'mt-core-lib'const props = defineProps({msg: {type: String,required: true,default: ''},width: {type: String,default: '138'},height: {type: String,default: '184'}
})
const imgUrl = reactive({ src: props.msg })
const conversionImg = new Image()
const isLoaded = ref(false) // 加载状态标志
const loadNumber = ref(5) // 加载次数
const videoRefs = ref()
let retryTimer: ReturnType<typeof setTimeout>const checkImageLoaded = () => {const loadImg = () => {conversionImg.onload = () => {if (!isLoaded.value) {isLoaded.value = trueimgUrl.src = conversionImg.srcclearTimeout(retryTimer) // 清除定时器}}conversionImg.onerror = () => {console.log('图片错误')if (!isLoaded.value && loadNumber.value > 0) {loadNumber.value--retryTimer = setTimeout(loadImg, 2000) // 启动定时器console.log('图片加载失败,重新加载', retryTimer)} else {isLoaded.value = trueclearTimeout(retryTimer) // 清除定时器}}conversionImg.src = props.msg}// 使用 requestIdleCallback() 方法在浏览器空闲时执行 loadImg() 函数if (window.requestIdleCallback) {window.requestIdleCallback(() => {loadImg()})} else {setTimeout(loadImg, 0)}
}const handleError = (event: Event) => {console.log('视频加载失败', event)// 使用 requestIdleCallback() 方法在浏览器空闲时执行 load() 函数if (window.requestIdleCallback) {window.requestIdleCallback(() => {videoRefs.value.load()})} else {setTimeout(() => {videoRefs.value.load()}, 1000)}
}onMounted(() => {if (!pathIsMp4(props.msg)) {checkImageLoaded()}
})onBeforeUnmount(() => {clearTimeout(retryTimer) // 清除定时器
})
</script>

总结

  1. 媒体组件,提供了失败的回调,可以使用失败回调,不断的load来加载数据
  2. 加载成功后,或者到达一定次数时,注意及时销毁

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

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

相关文章

千帆AppBuilder使用指南-创建应用

概述 百度智能云千帆AppBuilder使用指南&#xff08;以下简称为AppBuilder&#xff09;提供了多个预置应用框架的零代码创建能力或代码态开发能力&#xff0c;降低AI原生应用开发门槛。 1、知识问答应用&#xff08;RAG框架&#xff09; 高效的大模型知识检索增强框架&#…

二分以及练习题目

二分模板 判断是否可以二分 &#xff08;1&#xff09;单调性 备选答案集是有序的 &#xff08;2&#xff09;二段性 在检查了mid是否符合要求之和&#xff0c;我可以舍弃左右某一边的答案 两个模板 关键词&#xff1a;满足条件的最小值&#xff0c;最大值最小&#xff0…

掌握 MySQL 的数据类型

知道了表是由不同数据类型的列组成的&#xff0c;然后填充了一行一行的数据。 当我们要创建表的时候&#xff0c;就要根据业务需求&#xff0c;选择合适的数据类型。比如在实战项目中&#xff0c;文章表就是由下面这些不同数据类型的字段定义的。 目前用到了 bigint、tinyint、…

Vue基础篇

Vue Vue是一套用于构建用户界面的渐进式JavaScript框架 什么是渐进式? Vue可以自底向上逐层地应用; 当构建简单应用时, 只需一个轻量小巧的核心库; 当构建复杂应用时, 可以引入各式各样的Vue插件 Vue具有以下特点: 采用组件化模式, 提高代码复用率且让代码更好维护 声明式编…

CSS全局样式的设置,JavaScript运算符

面试题&#xff1a; Html 1&#xff0c;html语义化 2&#xff0c;meta viewport相关 3&#xff0c;canvas 相关 CSS 1&#xff0c;盒模型 1.1&#xff0c;ie盒模型算上border、padding及自身&#xff08;不算margin&#xff09;&#xff0c;标准的只算上自身窗体的大小 c…

爬虫案例一

首先我举一个案例比如豆瓣电影排行榜 (douban.com)这个电影&#xff0c;首先我们进去检查源代码 说明源代码有&#xff0c;说明是服务器渲染&#xff0c;可以直接那html 但是返回的结果是空&#xff0c;所以我们需要在头里面加上User-Agent 然后可以看到有返回的结果&#xff0…

Java递归生成本地文件目录树形结构

Java递归生成本地文件目录(树行结构) 1.读取txt文件保存的文件目录结构 2.递归生成本地文件目录树形结构&#xff0c;并修改目录文件前缀进行递增 3.结果截图 4.代码 package com.zfi.server.device;import io.swagger.annotations.Api; import org.springframework.web.bind…

【kubernetes】关于k8s集群的存储卷

目录 一、存储卷的分类 二、empty存储卷以及特点 三、hostpath存储卷以及特点 四、nfs存储卷以及特点 五、pvc存储卷 查看pv的定义 查看pvc的定义 实操&#xff1a;静态创建pv的方式 实现pvc存储卷 步骤一&#xff1a;先完成nfs的目录共享&#xff0c;需要准备不同的目…

JavaScript的`call`方法:实现函数间的调用!

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

plc远程锁机网关,远程锁机与防拆功能双重保障

在设备租赁和分期购买领域&#xff0c;如何确保设备的安全与资金的回收一直是各大厂家和卖家关注的重点。传统的锁机方式往往需要人工介入&#xff0c;不仅效率低下&#xff0c;而且成本高昂。如今&#xff0c;借助HiWoo Box的远程锁机功能&#xff0c;这些问题将迎刃而解。 什…

蓝海资讯|网红老阳推荐的视频号带货项目怎么样?

在当今社会&#xff0c;随着互联网的快速发展&#xff0c;网红经济已经成为一个热门的话题。在这个背景下&#xff0c;许多人都想通过加入网红行业来实现自己的财富自由。其中&#xff0c;网红老阳推荐的视频号带货项目引起了广泛关注。但是&#xff0c;这个项目是否真的如想象…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:点击回弹效果)

设置组件点击时回弹效果。 说明&#xff1a; 从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 clickEffect clickEffect(value: ClickEffect | null) 设置当前组件点击回弹效果。 系统能力&#xff1a; SystemCapabilit…