vue3+ts+IntersectionObserver实现图片懒加载

<template>
  <div>
      <div v-for="item,index in data" :key="item.id">
        <img :data-img="item.img" :data-key="index" :data-lazy-img-list="index" />
    </div>
  </div>
</template>

<script setup lang="ts">
import { nextTick ,onMounted} from 'vue';
const data=[{
		img: 'https://news.sznews.com/pic/2021-03/09/e37326cc-4583-48f3-aa00-ecc2392d319d.jpg',
		title: '36分钟,深圳平均通勤时间出炉!GDP10强城市中仅输杭州',
		evaluate: (Math.random() * 10).toFixed(2),
		collection: (Math.random() * 100).toFixed(2),
		price: (Math.random() * 10).toFixed(2),
		monSales: (Math.random() * 20).toFixed(2),
		id: 1,
		loading: true,
	}]

const lazyImg = (el: any, arr: any) => {
  const io = new IntersectionObserver((res) => {
    res.forEach((v: any) => {
      if (v.isIntersecting) {
        const { img, key } = v.target.dataset;
        v.target.src = img;
        v.target.onload = () => {
          io.unobserve(v.target);
          arr[key]['loading'] = false;
        };
      }
    });
  });
  nextTick(() => {
    document.querySelectorAll(el).forEach((img) => io.observe(img));
  });
};
onMounted(() => {
    lazyImg('[data-lazy-img-list]',data)
})

</script>

<style scoped></style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值