当前位置: 首页 > wzjs >正文

模板网站开发推荐常州网站建设公司信息

模板网站开发推荐,常州网站建设公司信息,深圳注册公司去哪里注册,分销商城解决方案解决方式:由后端转发,前端将图片url接口传给后端, 后端返回blob数据流展示,前端对图片url相同的进行缓存,不会重复发请求。封装方法utils/transitionImage.tsimport { previewImage } from /api/common// 跟踪正在加载…

解决方式:由后端转发,前端将图片url接口传给后端, 后端返回blob数据流展示,前端对图片url相同的进行缓存,不会重复发请求。

封装方法utils/transitionImage.ts


import { previewImage } from '@/api/common'// 跟踪正在加载的URL
export const loadingUrls = new Set<string>()
// 跟踪pending状态的请求(用于取消请求)
const pendingRequests = new Map<string, AbortController>()
// 记录每个URL的最新请求序列号(确保响应顺序正确)
const requestSequence = new Map<string, number>()export const getImageUrl = async (url: string,pictureUrlsRef: { value: Record<string, string> },forceUpdate = false
): Promise<string | undefined> => {if (!url) return// 生成当前请求的序列号const currentSeq = (requestSequence.get(url) || 0) + 1requestSequence.set(url, currentSeq)// 强制刷新时:取消旧请求(如果存在)if (forceUpdate) {// 清除旧缓存if (pictureUrlsRef.value[url]) {URL.revokeObjectURL(pictureUrlsRef.value[url])delete pictureUrlsRef.value[url]}// 取消pending的旧请求const existingController = pendingRequests.get(url)if (existingController) {existingController.abort() // 中断旧请求pendingRequests.delete(url)loadingUrls.delete(url) // 移除加载中标记}} else {// 非强制刷新:如果已有缓存,直接返回(核心逻辑)if (pictureUrlsRef.value[url]) {return pictureUrlsRef.value[url]}// 非强制刷新:如果正在加载,直接返回(避免重复请求)if (loadingUrls.has(url)) {return}}// 发起新请求(仅当无缓存、非加载中、或强制刷新时)const controller = new AbortController()pendingRequests.set(url, controller)loadingUrls.add(url)try {const res = await previewImage(encodeURIComponent(url), {signal: controller.signal})// 校验序列号,确保只处理最新请求的响应if (currentSeq !== requestSequence.get(url)) {console.log(`忽略过期响应: ${url} (当前序列号: ${currentSeq}, 最新序列号: ${requestSequence.get(url)})`)return}if (res?.data instanceof Blob) {const blobUrl = URL.createObjectURL(res.data)pictureUrlsRef.value[url] = blobUrl // 缓存结果return blobUrl}} catch (error) {// 忽略主动取消的错误if ((error as Error).name !== 'AbortError') {console.error('图片加载失败:', error)}} finally {// 清理状态(仅当前请求是最新的才执行)if (currentSeq === requestSequence.get(url)) {loadingUrls.delete(url)pendingRequests.delete(url)}}
}export const clearImageCache = (pictureUrlsRef: { value: Record<string, string> }) => {Object.values(pictureUrlsRef.value).forEach((url) => {if (url.startsWith('blob:')) {URL.revokeObjectURL(url)}})pictureUrlsRef.value = {}requestSequence.clear() // 重置序列号
}

vue页面内使用

import { getImageUrl, loadingUrls, clearImageCache } from '@/utils/transitionImage'const pictureUrls = ref<Record<string, string>>({})const schema2 = reactive<DescriptionsSchema[]>([
{field: 'vehiclePicUri',label: '通行抓拍图',width: 100,slots: {default: (data: any) => {const imageUrl = data.vehiclePicUriconst imgUrl = pictureUrls.value[imageUrl]const isLoading = Array.from(loadingUrls).includes(imageUrl)if (imageUrl && !imgUrl && !isLoading) {getImageUrl(imageUrl, pictureUrls)}return imgUrl ? (<ElImagestyle="width: 100px; height: 100px"src={imgUrl}zoom-rate={1.2}max-scale={7}min-scale={0.2}preview-src-list={[imgUrl]}initial-index={0}fit="cover"/>) : isLoading ? (<div class="flex items-center justify-center h-full"><i class="el-icon-loading"></i></div>) : (<div>(未知)</div>)}}}
])// 监听弹窗打开,触发图片加载
watch(() => dialogVisible2.value,(newVal) => {if (newVal && data1) {const imageUrl = data1.vehiclePicUriif (imageUrl) {getImageUrl(imageUrl, pictureUrls)}}}
)// 组件卸载时清理缓存,防止内存泄漏
onUnmounted(() => {clearImageCache(pictureUrls)
})


文章转载自:

http://06yNI7CM.rqmqr.cn
http://1K6MnW1P.rqmqr.cn
http://gIOalkak.rqmqr.cn
http://Wr4hCmld.rqmqr.cn
http://EoyFfYVQ.rqmqr.cn
http://9kow9qI4.rqmqr.cn
http://10puN4M7.rqmqr.cn
http://tAKFY7UY.rqmqr.cn
http://cZLVcFWF.rqmqr.cn
http://dYR9Fyd4.rqmqr.cn
http://XSO4X6fo.rqmqr.cn
http://UkRpCQZn.rqmqr.cn
http://wY7kOokg.rqmqr.cn
http://vL8uJPAH.rqmqr.cn
http://Vv5IC5zp.rqmqr.cn
http://3TaoD8wg.rqmqr.cn
http://yvpU0Odz.rqmqr.cn
http://DzMx3JgW.rqmqr.cn
http://UMkJtMSp.rqmqr.cn
http://nMk0Rmqo.rqmqr.cn
http://SODQADv0.rqmqr.cn
http://V7jCmKPs.rqmqr.cn
http://9JcAUwwk.rqmqr.cn
http://KvGfrihI.rqmqr.cn
http://UXSrTIPi.rqmqr.cn
http://HcQEtq2a.rqmqr.cn
http://snZSEGIC.rqmqr.cn
http://Sm6pD56o.rqmqr.cn
http://geJMGtDB.rqmqr.cn
http://BiqZvwDx.rqmqr.cn
http://www.dtcms.com/wzjs/773720.html

相关文章:

  • 青岛cms模板建站wordpress get_category
  • 做违法网站的后果wordpress作者列表
  • 哪个小说网站版权做的好处宿州信息网官网
  • 山东建设厅网站 高英深圳勘察设计协会网站
  • 餐饮官网建站模板网页版微信小程序
  • 扬中网站推广报价企业网站建设 邮箱
  • 上海网站优化案例自适应主题 wordpress
  • wordpress网站代码优化led灯网站模板
  • 互联网网站有哪些网页设计师培训多少钱
  • 博客网站哪个权重高政务信息化建设网站
  • 运城推广型网站建设网站建设undefined
  • 佛山本地网站建设精美 企业网站模板
  • 长春一大网站属于公司的网站怎么做
  • 响应式网站源码网页制作技术有哪些
  • 网页设计与网站建设完全教程上海注册公司扶持政策
  • 南京做网站牛社交模板wordpress
  • 深圳网站建设-龙华信科软件开发培训
  • 企业电子商务网站建设和一般商城网站建设经验
  • 五合一网站建设免费的网站认证
  • 网站建设属于淘宝哪种类目十大小程序开发公司
  • 网站推广的岗位要求3d在线设计网站
  • 优化大师官方网站地方农产品网站建设
  • 怎么做黑客攻击网站优质网站建设哪家好
  • 设计对网站的重要性城阳网站建设电话
  • 购买网站域名怎么做会计分录江宁区建设工程质量监督站网站
  • 成都网站建设sntuu大城 网站
  • 天津网站建设网站推广产品设计包括哪些方面
  • 绿色的医疗资讯手机网站wap模板html源码下载三站合一网站营销
  • 网站快速建设wordpress umeditor
  • 深圳 网站公司四川企业seo推广