实现思路

1、props支持传入最终要显示的图片、加载中图片、加载失败图
2、data定义两个变量,imgUrl存储当前显示的图片、error代表状态,包括0-加载中、1-加载成功、2-加载失败
3、imgUrl默认赋值loadingImg,没有传入的话就手动调用onload方法,因为src没有值的情况下不会触发load方法
4、触发load方法:创建一个Image实例,将img传入给该实例的src,在onload回调中,将img赋值给imgUrl,更新error状态为加载成功;在onerror回调中,将加载失败图片赋值给imgUrl,更新error状态为加载失败;最终将图片渲染到页面。

代码实现

<template><div class="default-img" v-if="img"><!-- 图片加载失败且没有传入加载失败图片,展示默认图 --><div v-if="error === 2 && !errorImg" class="placeholder-img"></div><!--显示传入的加载中、成功、失败 --><img v-else :src="imgUrl" @load="handleLoad" @error="handleError" :class="`load-img-default ${error === 0 && !loadingImg ? 'transparent': ''}`"></div>
</template><script lang="js">
import { defineComponent } from 'vue';
import DefaultImg from './../assets/nodata_default.png';export default defineComponent({name: 'DefaultImg',props: {img: { // 加载成功type: String,default: ''},errorImg: { // 加载失败type: String,default: DefaultImg},loadingImg: { // 加载中type: String,default: ''}},data() {return {imgUrl: '',error: 0 // 0-加载中 1-加载成功 2-加载失败}},watch: {// 监听图片更新img(newVal, oldVal) {if (!newVal || newVal === oldVal) returnthis.init()}},mounted() {this.init()},methods: {init() {this.error = 0this.imgUrl = this.loadingImgif (!this.imgUrl) {this.handleLoad()}},handleLoad() {const imgDom = new Image()imgDom.src = this.imgimgDom.onload = () => {this.error = 1this.imgUrl = this.img}imgDom.onerror = () => {this.error = 2this.imgUrl = this.errorImg}},handleError() {this.error = 2this.imgUrl = this.errorImg}}
});
</script>
<style scoped lang="scss">
.default-img {.placeholder-img {width: 100%;height: 100%;background: url('@/assets/nodata_default.png') no-repeat center;background-size: 50%;background-color: #f0f0f0;}.load-img-default {width: 100%;height: 100%;&.transparent {opacity: 0;position: absolute;transform: translateX(1000px);}}}
</style>

处理图片加载中与加载失败的组件相关推荐

  1. 一个简单的页面加载管理类(包含加载中,加载失败,数据为空,加载成功)

    在最近公布的比赛框架中,发现了页面加载管理类,觉得挺有用的,所以做个简单的笔记. 什么是页面加载管理类呢?(大佬可直接跳过翻看实现过程) 如果能有这个问题,那么很好,哈哈哈,你和我一样,刚开始都挺疑惑 ...

  2. 打开计算机不显示硬盘一直在加载中,硬盘加载不出来怎么办 下面5个步骤帮你解决...

    1.检查电脑上的USB接口是否损坏.可以使用两个不同的移动存储介质插在同一个USB接口测试,可能是USB供电不足导致移动硬盘无法正常启动,供电不足的现象有可能一开始就存在.如果一个能识别,一个不能识别 ...

  3. activity中fragment 返回键不退出_优雅地处理加载中(loading),重试(retry)和无数据(empty)等...

    LoadSir是一个高效易用,低碳环保,扩展性良好的加载反馈页管理框架,在加载网络或其他数据时候,根据需求切换状态页面,可添加自定义状态页面,如加载中,加载失败,无数据,网络超时,占位图,登录失效等常 ...

  4. ajax 延迟显示加载中提示

    近期做项目时用到了jquery的ajax,我希望实现"加载时提示用户"的功能,于是先习惯性的度娘谷哥了下,发现按照网上朋友所说的做,每次加载都会提示,不符合我的需求.于是我改进了下 ...

  5. layui 加载中_宝骏360促销中,最高直降0.91万,新车全国4.77万起!

    说到买车,大家都会有各种纠结.汽车作为日常生活的一种高消品,品牌配置差点的少则几万,中等好点的十几二十几万,高档高配置的几十上百甚至上千万,由于经济能力的不同,大家的选择也不尽相同,那么买车时,该如何 ...

  6. Vue3加载中(Spin)

    Vue2加载中(Spin) 可自定义设置以下属性: 是否为加载中状态(spinning),类型:boolean,默认 true 组件大小(size),类型:'small'|'default'|'lar ...

  7. bpl文件java,在LoadLibrary中动态加载BPL失败

    我想在Delphi 10 Seattle(Update 1)或Delphi 10.1 Berlin项目(Enterprise版本)中动态加载BPL模块 . 但LoadPackage函数失败并显示消息( ...

  8. dzzoffice,onlyoffice文档加载中下载失败

    前言 使用dzzoffice搭建的网盘系统结合onlyoffice实现在线文档共享编辑 docker运行的onlyoffice,配置完打开文档一直显示文档加载中,过段时间显示下载失败 这份文件无法保存 ...

  9. 计算机加载桌面失败,电脑开机以后进不去桌面一直在加载中,什么原因?

    大家好我是大明今天就"电脑开机以后进不去桌面一直在加载中,什么原因?"这一问题给大家做一下分享. 根据上述问题的描述和配图后我把这类故障归类于"开机启动类故障" ...

最新文章

  1. DataSet 动态添加列
  2. python读取txt中的一列称为,从python中的文本文件读取特定列
  3. 五条强化 SSH 安全的建议
  4. String、StringBuffer、StringBuilder介绍
  5. 1-2+3-4+......+99 除去88的和
  6. 在PHP网页中显示MySQL数据库内容
  7. Windows Me光盘启动安装过程
  8. 神武手游哪个服务器人最多,神武4端游什么老区人最多
  9. google 搜索跳转至yahoo
  10. llq考试 圣诞欢乐赛 (第二发)
  11. 云服务器修复漏洞用重启吗,漏洞修复后要重启吗
  12. 蓝桥杯题目练习(学做菜)
  13. 阿里巴巴2016年-校招-实习生岗位-内推
  14. 药学要学python吗_大一医学生有无必要学Python?
  15. 11月第2周业务风控关注|36名利用网络刷单实施诈骗的犯罪嫌疑人从菲律宾被押解回国
  16. 如何使用mac电脑远程你的windows电脑
  17. 如何安装cygwin
  18. 【线性代数】矩阵的基本概念和运算性质
  19. STRM--解决因配置Streams而在alert中出现的 ORA-02068错误
  20. Not All Carrots Are Orange

热门文章

  1. 借助花生壳把内网网站映射给外网。(内网穿透/路由器端口映射)、外网控制内网...
  2. windows MySQL数据备份
  3. Android --- logcat 打印日志、设置缓存大小、过滤等
  4. 海安中等专业学校18计算机,江苏海安中等专业学校
  5. Android AAPT详解
  6. [转载]会思考的机器预言家-《环球科学》2012年第8期
  7. JMX 使用指南一 Java Management Extensions
  8. 我的世界服务器死亡信息汉化,我的世界1.5.2-1.8.8尸体插件
  9. 7-5 辛苦的搬运工
  10. LOL作者或者C+会的来这里