aslan-h5/src/directives/smartImage.js

84 lines
2.6 KiB
JavaScript

// src/directives/smartImage.js
import { imageCacheManager } from '@/utils/imageCacheManager'
export const smartImage = {
async mounted(el, binding) {
if (binding.value) {
// 设置加载状态样式
el.style.opacity = '0'
el.style.transition = 'opacity 0.3s ease-in-out'
try {
// 对于OSS图片使用特殊处理
if (binding.value.startsWith('https://tkm-likei.oss-ap-southeast-1.aliyuncs.com/h5')) {
const img = new Image()
img.crossOrigin = 'anonymous'
img.onload = () => {
el.src = binding.value
el.style.opacity = '1'
}
img.onerror = (error) => {
console.warn(`图片加载失败: ${binding.value}`, error)
el.src = binding.value
el.style.opacity = '1'
}
img.src = binding.value
} else {
// 对于外部链接,直接使用普通加载方式
if (!imageCacheManager.isBuildAsset(binding.value)) {
el.src = binding.value
el.style.opacity = '1'
return
}
await imageCacheManager.loadImage(binding.value)
el.src = binding.value
el.style.opacity = '1'
}
} catch (error) {
console.warn(`图片加载失败: ${binding.value}`, error)
el.src = binding.value
el.style.opacity = '1'
}
}
},
async updated(el, binding) {
if (binding.value !== binding.oldValue && binding.value) {
el.style.opacity = '0'
try {
// 对于OSS图片使用特殊处理
if (binding.value.startsWith('https://tkm-likei.oss-ap-southeast-1.aliyuncs.com/h5')) {
const img = new Image()
img.crossOrigin = 'anonymous'
img.onload = () => {
el.src = binding.value
el.style.opacity = '1'
}
img.onerror = (error) => {
console.warn(`图片更新失败: ${binding.value}`, error)
el.src = binding.value
el.style.opacity = '1'
}
img.src = binding.value
} else {
// 对于外部链接,直接使用普通加载方式
if (!imageCacheManager.isBuildAsset(binding.value)) {
el.src = binding.value
return
}
await imageCacheManager.loadImage(binding.value)
el.src = binding.value
el.style.opacity = '1'
}
} catch (error) {
console.warn(`图片更新失败: ${binding.value}`, error)
el.src = binding.value
el.style.opacity = '1'
}
}
},
}