Vue3 中封装函数实现加载图片&加载失败兜底方案。


Vue3 中使用动态加载图片并处理加载失败的情况

在开发 Vue3 应用时,我们经常会遇到需要动态加载图片的场景。例如,图片资源可能从后端获取,或者需要加载用户上传的图片。如果图片加载失败,通常我们会希望显示一张默认的兜底图片。本文将介绍如何使用 Vue3 的组合式 API 实现这一功能。


实现思路
  1. 动态加载图片:通过 JavaScript 的 Image 对象,动态加载图片资源。
  2. 监听加载状态:使用 onloadonerror 事件,分别处理图片加载成功和失败的情况。
  3. 使用 Vue3 的 ref:将图片的 src 绑定到 Vue 的响应式数据中,以便在加载失败时动态切换到兜底图片。

代码实现

以下是完整的代码实现:

<template>
  <img :src="src" width="300" alt="" />
</template>

<script setup lang="ts">
import { ref } from 'vue'
const src = ref('')
const loadImg = (
  src: string,
  callback: (err: Error | Event | null | string, src?: string) => void
) => {
  const img = new Image()
  img.src = src
  img.onload = () => {
    callback(null, src)
  }
  img.onerror = (err) => {
    callback(err)
  }
}
loadImg('/src/assets/logo.svg', (err, res) => {
  if (err) {
    console.log('图片加载失败,使用兜底图片:', err)
    src.value = '/src/assets/2.jpg'
  } else {
    console.log('图片加载成功:', res)
    if (res) {
      src.value = res
    }
  }
})
</script>

<style scoped></style>

代码解析
  1. 动态加载图片

    • 使用 new Image() 创建一个图片对象。
    • 设置 img.src 为目标图片的 URL。
    • 使用 onloadonerror 事件分别处理加载成功和失败的情况。
  2. Vue3 的响应式数据

    • 使用 ref 定义响应式变量 src,并将其绑定到 <img> 标签的 src 属性。
    • 当图片加载失败时,通过 src.value 动态切换到兜底图片。
  3. 回调函数

    • 回调函数接收两个参数:err(错误信息)和 res(成功加载的图片 URL)。
    • 根据加载结果,决定是使用目标图片还是兜底图片。

注意事项
  1. 路径问题

    • 图片路径需要正确配置,特别是在使用 vitewebpack 等构建工具时,静态资源路径可能需要通过 importrequire 引入。
    • 例如,可以将兜底图片路径改为:import fallbackImg from '@/assets/2.jpg',然后使用 src.value = fallbackImg
  2. 错误处理

    • onerror 回调中,可以记录详细的错误信息(如 err.message),以便调试。
  3. 样式优化

    • 可以根据需求为图片添加样式,例如设置固定宽高、圆角等。

扩展功能
  1. 全局兜底图片

    • 如果多个地方需要使用兜底图片,可以将兜底图片路径提取为全局常量,方便统一管理。
  2. 加载动画

    • 在图片加载过程中,可以显示一个加载动画或占位符,提升用户体验。
  3. 重试机制

    • 如果图片加载失败,可以提供重试按钮,允许用户手动重新加载图片。

效果:
加载成功
在这里插入图片描述
加载失败
在这里插入图片描述

总结

通过本文的代码示例,我们实现了在 Vue3 中动态加载图片并处理加载失败的情况。这种方法简单易用,能够很好地满足实际开发中的需求。同时,通过结合 Vue3 的组合式 API,代码更加清晰和模块化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值