【Vue3】图片未加载成功前占位

背景

在写项目时,加载图片未成功前,会出现空白页面,太影响美观和体验感
在这里插入图片描述

解决方案

1. element ui通过slot占位符解决

在这里插入图片描述

2. 自定义指令

原生img标签可以通过自定义指令解决,img标签有onload和onerror事件,都是在渲染成功后才出发,想占位要在渲染前触发

<template>
     <img
         class="image_item-img"
         v-preload="'loading'" 
         src="https://xx"
         alt="加载失败"
     />
</template>
<script setup>
import { reactive } from 'vue'

// 自定义图片占位
const vPreload = {
	//未渲染img标签前
    beforeMount(el, binding) {
        el.style.backgroundColor = '#ececec'
        el.classList.add(binding.value) //binding.value是上面传过来'loading',我自定义的类名(可自己定义loading样式)
    },
    mounted(el, binding) {
        el.addEventListener('error', () => {
            el.classList.remove(binding.value)
        })
    },
}
</script>

在这里插入图片描述

3.用图片代替

 <img
     class="image_item-img"
     v-for="(item, index) in imageList"
     :key="item.id"
     :src="item.url ? require('/src/assets/logo.png') : item.url"
     alt="加载失败"
     @click="handlePreview(index)"
 />
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现图片加载的自定义指令,你可以按照以下步骤进行: 1. 创建一个自定义指令文件,比如 `lazyload.js`。 2. 在 `lazyload.js` 文件中,定义一个全局自定义指令 `v-lazyload`,并添加相应的逻辑。 ```javascript // lazyload.js // 判断元素是否在可视区域内 function isInViewport(el) { const rect = el.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); } // 加载图片 function loadImage(el) { if (el.getAttribute('data-src')) { el.src = el.getAttribute('data-src'); el.removeAttribute('data-src'); } } // Vue 自定义指令 Vue.directive('lazyload', { inserted: function(el) { // 初始状态先将图片设置为占位图 el.src = 'placeholder.jpg'; // 判断图片是否在可视区域内,如果在则加载图片 if (isInViewport(el)) { loadImage(el); } }, bind: function(el) { if (isInViewport(el)) { loadImage(el); } }, scroll: function(el) { if (isInViewport(el)) { loadImage(el); } } }); ``` 3. 在主文件中引入自定义指令文件。 ```javascript // main.js import Vue from 'vue'; import './lazyload.js'; // 引入自定义指令文件 new Vue({ // ... }).$mount('#app'); ``` 4. 在需要懒加载图片上使用自定义指令 `v-lazyload`。 ```html <template> <div> <img v-lazyload data-src="image.jpg" alt="Lazy loaded image"> </div> </template> ``` 这样,当图片进入可视区域时,即可加载对应的图片。记得替换 `placeholder.jpg` 和 `image.jpg` 为你自己的图片路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值