IntersectionObserver滚动触底监听事件

IntersectionObserver滚动触底监听事件

场景

滚动触底事件、上拉加载、当前视窗与目标元素错位交互
目标元素出现在可视区外,未来可能出现在可视区内并触发一些回调,或请求新的数据。
默认HTML为顶级可视区,则涉及滚动的部分不在可视区内的可进行监听

const intersectionObserver = new IntersectionObserver((entries) => {
            if (entries[0].intersectionRatio <= 0) return;
            console.log("当前监听的目标元素在视窗内完全可见")
            // 此处为监听的目标元素完全暴露在可视范围内执行
            // 写你自己的代码逻辑    
          });
          const trAll = document.querySelectorAll('.ant-table-scroll tr');
          intersectionObserver.observe(trAll[trAll.length - 1]);// 里面替换成你要监听的目标元素(不在可视区范围内的)我这个地方是需要监听可视区外表格的最后一行
Vue 3 中实现监听滚动触底功能,可以通过自定义指令或使用 `IntersectionObserver` API 来检测元素是否滚动到底部。以下是两种常见实现方式: ### 1. 使用自定义指令监听滚动事件 ```javascript // main.js import { createApp } from 'vue' import App from './App.vue' const app = createApp(App) app.directive('infinite-scroll', { mounted(el, binding) { let isLoading = false const throttleDelay = 200 let lastScrollTime = 0 const handleScroll = () => { const now = Date.now() if (isLoading || now - lastScrollTime < throttleDelay) return const rect = el.getBoundingClientRect() const offsetBottom = rect.bottom const threshold = window.innerHeight + document.documentElement.scrollTop + parseInt(binding.arg || '0') if (offsetBottom <= threshold) { isLoading = true lastScrollTime = now binding.value().then(() => { isLoading = false }) } } el.__infiniteScrollHandler__ = handleScroll window.addEventListener('scroll', handleScroll) }, unmounted(el) { window.removeEventListener('scroll', el.__infiniteScrollHandler__) delete el.__infiniteScrollHandler__ } }) app.mount('#app') ``` 在组件中使用该指令: ```vue <template> <div v-infinite-scroll="loadMore">内容区域</div> </template> <script> export default { methods: { loadMore() { // 模拟异步加载数据 return new Promise(resolve => { setTimeout(() => { // 加载更多数据逻辑 resolve() }, 1000) }) } } } </script> ``` ### 2. 使用 `IntersectionObserver` API 实现触底检测 ```vue <template> <div ref="scrollContainer" class="scroll-container"> <!-- 数据列表 --> <div v-for="item in items" :key="item.id">{{ item.name }}</div> <!-- 触底检测元素 --> <div ref="observerTarget" class="observer-target"></div> </div> </template> <script> export default { data() { return { items: [], observer: null, count: 0 } }, mounted() { this.observer = new IntersectionObserver(entries => { if (entries[0].isIntersecting) { this.loadMore() } }, { rootMargin: '0px', threshold: 1.0 }) this.observer.observe(this.$refs.observerTarget) }, beforeUnmount() { if (this.observer) { this.observer.disconnect() } }, methods: { loadMore() { // 模拟异步加载数据 setTimeout(() => { for (let i = 0; i < 10; i++) { this.items.push({ id: this.count++, name: `Item ${this.count}` }) } }, 1000) } } } </script> <style scoped> .scroll-container { height: 100vh; overflow-y: auto; } .observer-target { height: 20px; } </style> ``` ### 参数说明 - `v-infinite-scroll`:绑定加载数据的方法。 - `infinite-scroll-disabled`:控制是否禁用无限滚动功能。 - `infinite-scroll-distance`:设置触发加载的阈值,单位为像素。 - `infinite-scroll-throttle-delay`:限制滚动事件触发的频率,防止频繁调用。 以上方法均可在 Vue 3 中实现监听滚动触底的功能,并结合异步加载数据实现“无限滚动”效果[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值