2022-11-21 22:21:53 +09:00
|
|
|
import { decode } from 'blurhash'
|
|
|
|
import { getDataUrlFromArr } from '~~/composables/utils'
|
|
|
|
|
|
|
|
export default defineComponent({
|
|
|
|
inheritAttrs: false,
|
|
|
|
props: {
|
|
|
|
blurhash: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
src: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
setup(props, { attrs }) {
|
|
|
|
const placeholderSrc = ref<string>()
|
|
|
|
const isLoaded = ref(false)
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
const img = document.createElement('img')
|
2022-11-27 22:12:25 +09:00
|
|
|
isLoaded.value = img.complete
|
2022-11-21 22:21:53 +09:00
|
|
|
img.onload = () => {
|
|
|
|
isLoaded.value = true
|
|
|
|
}
|
|
|
|
img.src = props.src
|
2022-11-24 13:13:13 +09:00
|
|
|
setTimeout(() => {
|
|
|
|
isLoaded.value = true
|
|
|
|
}, 3_000)
|
2022-11-21 22:21:53 +09:00
|
|
|
|
|
|
|
if (props.blurhash) {
|
|
|
|
const pixels = decode(props.blurhash, 32, 32)
|
|
|
|
placeholderSrc.value = getDataUrlFromArr(pixels, 32, 32)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
return () => isLoaded.value || !placeholderSrc.value
|
|
|
|
? h('img', { ...attrs, src: props.src })
|
|
|
|
: h('img', { ...attrs, src: placeholderSrc.value })
|
|
|
|
},
|
|
|
|
})
|