vue3 pc端list滚动加载的简单实现

文章介绍了如何在Vue3应用中实现PC端列表的滚动加载功能,利用scroll事件监听滚动条,结合scrollHeight、scrollTop和clientHeight判断是否滚动到底部,当到达底部时加载更多数据。使用@scroll.passive修饰符能提升滚动的流畅性。

vue3 pc端list滚动加载的简单实现

昨天做了个功能,电脑端list实现滚动加载更多。原理并不难:获取滚动条,根据滚动条的scrollHeight、scrollTop、clientHeight计算出滚动条距底部的距离,如果滚动条滚动到底部,则触发事件。
但是我遇到了一个问题:给ul绑定了class,通过
document.querySelector获取不到ul,后来试了vue的事件@scroll,可以轻松获取到了。

<ul @scroll="handleScroll($event)">
	<li></li>
</ul>

在滚动事件中

//滚动事件
    const handleScroll = (event) => {
      let scrollBottom =// 滚动到底部的距离
                        event.target.scrollHeight -
                        event.target.scrollTop -
                        event.target.clientHeight;
      if(scrollBottom < 1){
        console.log('滚动到底部了')
        if(state.size<state.total){ //判断什么时候调用
          state.size += 10 //通过pageSize增加的方法加载更多数据
          getSearch(state.size) //调用接口方法
        }
      }
    }

到这里,基本功能就实现了。
在绑定的事件后可以加上.passive修饰符,它的作用是:事件的默认行为立即执行,不用等到函数执行完毕。可以让滚动事件更流畅。

<ul @scroll.passive="handleScroll($event)">
	<li></li>
</ul>
### Vue实现 PC 滚动触发分页功能 在 Vue实现 PC 滚动触发分页功能,可以通过监听窗口的 `scroll` 事件来检测用户是否已经滚动到页面底部。当满足条件时,可以调用接口获取更多数据并将其追加到当前列表中。 以下是具体的实现方式: #### 1. HTML 结构 创建一个容器用于显示数据列表,并设置样式以便于观察滚动行为。 ```html <div id="app"> <ul> <li v-for="(item, index) in dataList" :key="index">{{ item }}</li> </ul> </div> ``` #### 2. CSS 样式 为了模拟大量数据的情况,可以为容器添加固定高度和溢出属性。 ```css <style> #app { height: 400px; overflow-y: auto; } ul { list-style-type: none; padding: 0; } li { margin-bottom: 10px; } </style> ``` #### 3. JavaScript 实现逻辑 通过 Vue 组件的方式绑定滚动事件,并动态加载新数据。 ```javascript new Vue({ el: &#39;#app&#39;, data() { return { dataList: [], // 存储已加载的数据 page: 1, // 当前页数 loading: false,// 加载状态标志位 hasMoreData: true // 是否还有更多数据 }; }, mounted() { this.fetchData(); // 初始化加载第一页数据 window.addEventListener(&#39;scroll&#39;, this.handleScroll); // 添加滚动事件监听 }, beforeDestroy() { window.removeEventListener(&#39;scroll&#39;, this.handleScroll); // 移除滚动事件监听 }, methods: { fetchData() { if (this.loading || !this.hasMoreData) return; // 如果正在加载或者没有更多数据,则不继续请求 this.loading = true; setTimeout(() => { // 模拟异步请求 const newData = Array.from({ length: 10 }, (_, i) => `Item ${(this.page - 1) * 10 + i}`); this.dataList.push(...newData); this.page++; this.loading = false; if (this.page >= 5) { // 假设只有5页数据 this.hasMoreData = false; } }, 1000); }, handleScroll() { if ( window.innerHeight + document.documentElement.scrollTop !== document.documentElement.offsetHeight || this.loading ) return; this.fetchData(); } } }); ``` 上述代码实现了以下功能: - **初始化加载**:在组件挂载完成后立即加载第一页数据[^1]。 - **滚动事件监听**:通过 `window.addEventListener(&#39;scroll&#39;)` 方法监听用户的滚动操作。 - **触底判断**:当滚动条距离顶部的高度加上视窗高度等于文档总高度时,认为到达了页面底部。 - **防抖处理**:为了避免频繁触发 API 请求,在每次请求未完成之前不会再次发起请求。 #### 4. 插件扩展 如果希望减少手动编写逻辑的工作量,也可以借助第三方插件如 `vue-infinite-scroll` 来简化开发过程。安装该插件后只需简单配置即可实现相同的效果。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值