Vue3 中使用动态加载图片并处理加载失败的情况
在开发 Vue3 应用时,我们经常会遇到需要动态加载图片的场景。例如,图片资源可能从后端获取,或者需要加载用户上传的图片。如果图片加载失败,通常我们会希望显示一张默认的兜底图片。本文将介绍如何使用 Vue3 的组合式 API 实现这一功能。
实现思路
- 动态加载图片:通过 JavaScript 的
Image
对象,动态加载图片资源。 - 监听加载状态:使用
onload
和onerror
事件,分别处理图片加载成功和失败的情况。 - 使用 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>
代码解析
-
动态加载图片:
- 使用
new Image()
创建一个图片对象。 - 设置
img.src
为目标图片的 URL。 - 使用
onload
和onerror
事件分别处理加载成功和失败的情况。
- 使用
-
Vue3 的响应式数据:
- 使用
ref
定义响应式变量src
,并将其绑定到<img>
标签的src
属性。 - 当图片加载失败时,通过
src.value
动态切换到兜底图片。
- 使用
-
回调函数:
- 回调函数接收两个参数:
err
(错误信息)和res
(成功加载的图片 URL)。 - 根据加载结果,决定是使用目标图片还是兜底图片。
- 回调函数接收两个参数:
注意事项
-
路径问题:
- 图片路径需要正确配置,特别是在使用
vite
或webpack
等构建工具时,静态资源路径可能需要通过import
或require
引入。 - 例如,可以将兜底图片路径改为:
import fallbackImg from '@/assets/2.jpg'
,然后使用src.value = fallbackImg
。
- 图片路径需要正确配置,特别是在使用
-
错误处理:
- 在
onerror
回调中,可以记录详细的错误信息(如err.message
),以便调试。
- 在
-
样式优化:
- 可以根据需求为图片添加样式,例如设置固定宽高、圆角等。
扩展功能
-
全局兜底图片:
- 如果多个地方需要使用兜底图片,可以将兜底图片路径提取为全局常量,方便统一管理。
-
加载动画:
- 在图片加载过程中,可以显示一个加载动画或占位符,提升用户体验。
-
重试机制:
- 如果图片加载失败,可以提供重试按钮,允许用户手动重新加载图片。
效果:
加载成功
加载失败
总结
通过本文的代码示例,我们实现了在 Vue3 中动态加载图片并处理加载失败的情况。这种方法简单易用,能够很好地满足实际开发中的需求。同时,通过结合 Vue3 的组合式 API,代码更加清晰和模块化。