vue3+ts 图片懒加载

<template>
  <div>
    <div class="div-box">
      <img
        v-lazy="item"
        :src="item"
        v-for="item in arr"
        :key="item"
        alt=""
        width="360"
        height="500"
      />
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
import type { Directive } from "vue";
import { entries } from "lodash";
// glob 是懒加的模式
// globEager 静态加载
let imageList = import.meta.globEager("./assets/images/*.*");
let imageList2: Record<
  string,
  { default: string }
> = import.meta.glob("./assets/images/*.*", { eager: true });
let arr = Object.values(imageList2).map((v) => v.default);
console.log(imageList, arr, "imageList");

let vLazy: Directive<HTMLImageElement, string> = async (el, binding) => {
  console.log(el, "el");
  const def = await import("./assets/vue.svg");
  el.src = def.default;
  const observe = new IntersectionObserver((entries) => {
    console.log(entries, binding.value);
    if (entries[0].intersectionRatio > 0) {
      setTimeout(() => {
        el.src = binding.value;
      }, 500);
      observe.unobserve(el);
    }
  });
  observe.observe(el);
};
</script>

<style>
.div-box {
  overflow: scroll;
  height: 100vh;
}
</style>
Vue3 中,可以使用 `Intersection Observer` 实现图片的懒加载。下面是一个使用 TypeScript 实现的图片懒加载示例: 安装 `intersection-observer` 库: ```bash npm install intersection-observer --save ``` 创建一个 `LazyImage` 组件: ```vue <template> <img :src="placeholder" :data-src="src" /> </template> <script lang="ts"> import { defineComponent, ref, onMounted } from 'vue'; import 'intersection-observer'; export default defineComponent({ props: { src: { type: String, required: true, }, placeholder: { type: String, default: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=', }, }, setup(props) { const imageRef = ref<HTMLImageElement | null>(null); const observer = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { const img = entry.target as HTMLImageElement; img.src = img.dataset.src || ''; observer.unobserve(img); } }); }); onMounted(() => { if (imageRef.value) { observer.observe(imageRef.value); } }); return { imageRef, }; }, }); </script> ``` 在父组件中使用 `LazyImage` 组件: ```vue <template> <div> <lazy-image src="https://example.com/image1.jpg" /> <lazy-image src="https://example.com/image2.jpg" /> <lazy-image src="https://example.com/image3.jpg" /> </div> </template> <script lang="ts"> import { defineComponent } from 'vue'; import LazyImage from './LazyImage.vue'; export default defineComponent({ components: { LazyImage, }, }); </script> ``` `LazyImage` 组件中,使用 `Intersection Observer` 监听图片是否进入视野,如果进入视野,则加载图片;如果未进入视野,则不加载图片,以此实现图片懒加载的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你的美,让我痴迷

你的好,我会永远记住你的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值