当前位置:   article > 正文

vue中实现图片懒加载的方法(二)_el-image的懒加载展示

el-image的懒加载展示

背景:

上期实现了图片懒加载,但是经过测试,使用组件的方式会有卡顿的问题。通过查看图片请求,发现图片加载按顺序请求,如下图:

 发现卡顿是因为图片从上到下依次加载,上面加载完成显示下面的,在滚动的时候就会感觉有卡顿感、

优化:

将上期组件内的 img 标签干掉,监听其父元素,当父元素进入可视区域内,动态创建 img 添加到父元素内,上代码,BGM 起

  1. <template>
  2. <div class="img-box" v-lazy="vm" :data-src="src">
  3. <!-- <img
  4. v-lazy="lazy"
  5. :data-src="src"
  6. src=""
  7. @load="loadImg"
  8. @error="error"
  9. alt=""
  10. /> -->
  11. <slot v-if="slotShow"></slot>
  12. <slot name="err" v-if="errFlag"></slot>
  13. </div>
  14. </template>
  15. <script>
  16. export default {
  17. props: {
  18. src: {
  19. type: String,
  20. default: "",
  21. },
  22. },
  23. data() {
  24. return {
  25. slotShow: true,
  26. errFlag: false,
  27. vm: null,
  28. };
  29. },
  30. created() {
  31. this.vm = this;
  32. },
  33. // 这个指令可以放到全局
  34. directives: {
  35. lazy: {
  36. inserted(el, { value }) {
  37. const imgSrc = el.dataset.src;
  38. const observer = new IntersectionObserver(([{ isIntersecting }]) => {
  39. if (isIntersecting) {
  40. // 动态创建 img 标签
  41. let img = document.createElement("img");
  42. img.src = imgSrc;
  43. img.style.width = "100%";
  44. img.style.height = "100%";
  45. // 添加图片加载完成事件,加载完成,让加载前的样式隐藏
  46. img.onload = function () {
  47. value.slotShow = false;
  48. };
  49. (img.onerror = function () {
  50. // 加载失败得时候 失败后得样式显示
  51. value.errFlag = true;
  52. // 让加载前得样式隐藏,
  53. value.slotShow = false;
  54. }),
  55. el.appendChild(img);
  56. observer.unobserve(el);
  57. }
  58. });
  59. observer.observe(el);
  60. },
  61. },
  62. },
  63. methods: {
  64. },
  65. };
  66. </script>
  67. <style lang="less" scoped>
  68. .img-box {
  69. display: flex;
  70. position: relative;
  71. overflow: hidden;
  72. }
  73. img {
  74. width: 100%;
  75. height: 100%;
  76. object-fit: cover;
  77. }
  78. </style>

使用:

在父组件中使用

  1. <template>
  2. <div>
  3. <!-- 图片懒加载最好设置图片高度,因为不管你是监听滚动条的方式,还是利用监听器api实现,都跟元素可视区域有关系,而高度就影响是否在可视区域内 -->
  4. <lazyImg :index="i" v-for="(item,i) in lazyImgs" :key="i" :src="item">
  5. <!-- 图片加载之前默认在图片元素上方展示的样式--自由发挥 -->
  6. <div class="slot-txt">加载中</div>
  7. <template #err>
  8. <!-- 图片加载失败后在上面展示的样式--- 自由发挥 -->
  9. <div class="slot-txt"><img src="@/assets/images/icon_activity_copy_link.png" alt=""></div>
  10. </template>
  11. </lazyImg>
  12. </div>
  13. </template>

完结: vue中图片懒加载组件流畅性完美解决,撒花

疑问: 为什么组件内部直接写 img 会有卡顿现象?而动态创建的img 标签则很流畅,这是什么原因?欢迎一起讨论

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/496042
推荐阅读
相关标签
  

闽ICP备14008679号