vue页面父组件滚动触底,子组件触发事件

本文介绍在Vue中如何实现在父组件滚动到底部时触发事件,并将状态传递给子组件进行响应式更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue页面父组件滚动触底,子组件触发事件

父组件中监听滚动:

methods : {
	watchScroll : function () {} {
		let that = this
		let clientHeight = document.documentElement.clientHeight || document.body.clientHegiht; //页面高度
		let divObj = document.getElementById('#container')
		// let divObj = $('#container')[0]
		let oTop = document.body.scrollTop == 0 ? document.documentElement.scrollTop : document.body.scrollTop; //滚动条已经滚动的高度(被卷曲的高度)
		let scrollHeight = divObj.scrollHeight //滚动条总高度
		if(oTop + clientHeight >= scrollHeight){//触底
			//改变变量并传给子组件
			//that.getMore = true
		}
	}
}
mounted : {
	window.addEventListener('scroll',this.watchScroll,true);
}
destroyed : {
	window.removeEventListener('scroll',this.watchScroll);
}

子组件接收变量后watch数据变化:

Vue.component('son', {
	props: ['getMore'],
	data: function () {
		return {
	    	more: ''
		}
	},
	watch : {
		getMore() {
		this.more = this.getMore
		console.log('触底了!!')
		}
	}
}
### 实现 Vue3 中子组件自动触底功能 为了实现在 Vue3 的子组件中检测到页面触底触发相应事件,可以采用监听窗口滚动位置的方法。这种方法不仅适用于整个页面滚动,也可以应用于特定可滚动区域内的子组件。 #### 使用 Intersection Observer API 进行优化 Intersection Observer 是一种高效的API,用于监控目标元素与其祖先元素或视口之间的交叉状态变化。这非常适合用来判断某个元素是否进入了可视区,从而实现触底加载的效果[^1]。 对于需要在整个页面上工作的场景,可以在父级应用此逻辑,并通过 props 或 emit 将行为传递给子组件处理。而对于限定于单个 DOM 节点内部的情况,则可以直接在该节点对应的组件里集成这一特性。 下面是一个基于 `ButtomDetector` 组件的例子: ```html <template> <div @scroll="handleScroll"> <!-- 列表项 --> <slot></slot> <!-- 触底探测器 --> <div ref="bottomRef"></div> </div> </template> <script setup lang="ts"> import { ref, onMounted } from 'vue'; const bottomRef = ref(null); let observer; onMounted(() => { initObserver(); }); function handleScroll(event) { const target = event.target; if (target.scrollTop + target.clientHeight >= target.scrollHeight - 50 /* 容差 */) { loadMore(); // 当接近底部时调用加载更多函数 } } async function loadMore() { console.log('Loading more...'); await new Promise((resolve) => setTimeout(resolve, 1000)); // 模拟异步请求 // 更新数据源... } // 初始化观察者 function initObserver(){ observer = new IntersectionObserver(([entry])=>{ if(entry.isIntersecting){ loadMore(); } },{threshold:1}); observer.observe(bottomRef.value); } </script> ``` 上述代码展示了如何创建一个名为 `ButtomDetector` 的自定义组件来监测其包裹的内容是否已经到达了容器的最下方。一旦发生这种情况,就会执行预设的动作——这里是模拟了一个延迟后的日志输出作为占位符,在实际应用场景中应该替换为真正的数据获取逻辑。 此外,针对 Element Plus 库中的特殊需求,如果遇到由于 `<teleport>` 导致无法正常工作的问题,可以通过调整 JavaScript 获取DOM的方式解决这个问题。具体来说就是利用 document.querySelector 替代原本试图作用于局部范围的选择器表达式[^2]。 最后值得注意的一点是在某些情况下可能还需要考虑性能因素,比如频繁触发 scroll 事件可能会带来不必要的开销。因此建议设置防抖机制或者仅当确实靠近边界才进行进一步的操作检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值