element plus Infinite Scroll 无限滚动

欢迎关注我的公众号:夜说猫,让一个贫穷的程序员不靠打代码也能吃饭~

零零糖公众号

element plus官网中,Infinite Scroll示例使用的是数字,在实际项目运用中,我们更多的是使用json数组进行渲染,所以我们改写v-infinite-scroll属性的load方法。

v-infinite-scroll在使用之前,有两点要注意

1、在加载页面的时候,element plus会根据容器的高度,自动调用v-infinite-scroll后面的方法,让数据自动填充整个容器。

所以你会发现,自己明明只默认两个或三个数据,但是数据总是填满了容器,出现了更多个数据。

2、要使用ref()方法赋值,成为一个响应式的变量,对这个变量进行修改节点才会响应变化。

如果没有使用ref()方法,数据不会实时监听。

以上两点,在官网都没有提到,至少在这个组件的介绍的页面没有提到。

是初学者容易遇到的坑。

修改示例代码,使用数组

<template>
<ul v-infinite-scroll="load" infinite-scroll-disabled="false" infinite-scroll-distance="1" class="infinite-list" style="overflow: auto">
    <!--<li v-for="i in count" :key="i" class="infinite-list-item">{{ i }}</li>-->
	<li v-for="item in list" :key="item.id" class="infinite-list-item">
	{{ item.id }}{{ item.title }}
	</li>
  </ul>
</template>


<script lang="ts" setup>
import { ref } from 'vue'

//瀑布流
//import { ref } from 'vue'
//const count = ref(0)
  const list=ref([]);
const load = () => {
  //count.value += 2
  //如果是异步请求,只需把异步请求得到的数据赋值给items即可
  var items=[
	{id:1,title:'华为竟然突破封锁发布高端手机'},
	{id:2,title:'一大批程序员在夜说猫公众号发牢骚?'},
	{id:3,title:'东南亚高薪工作,竟然是诈骗'},
	{id:4,title:'房价下跌,年轻人买房的机会来了吗'},
	{id:5,title:'为什么现在的武打戏越来越不好看了?'}];
	list.value=list.value.concat(items);
}

</script>

<style>
.infinite-list {
  height: 300px;
  padding: 0;
  margin: 0;
  list-style: none;
}
.infinite-list .infinite-list-item {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 50px;
  background: var(--el-color-primary-light-9);
  margin: 10px;
  color: var(--el-color-primary);
}
.infinite-list .infinite-list-item + .list-item {
  margin-top: 10px;
}
</style>

效果预览

夜说猫-Infinite Scroll 无限滚动

欢迎关注我的公众号【夜说猫】,一个程序员偶尔发牢骚的公众号。

<think>我们正在解决在手机浏览器中使用element-plusInfinite Scroll无限滚动)时触底不刷新的问题。根据提供的引用和常见问题,我们可以从以下几个方面进行排查和解决: 1. **检查滚动容器设置**:Infinite Scroll需要绑定在正确的滚动容器上。在移动端,通常滚动容器是`body`或某个具有固定高度和`overflow:auto`的div。确保`v-infinite-scroll`绑定在正确的滚动容器上,并且该容器有设置高度和溢出滚动。 2. **设置触发距离**:移动端触底判断可能因为精度问题导致不触发,可以设置`infinite-scroll-distance`属性为一个较小的值(如1)来确保在接近底部时就触发加载。 3. **禁用滚动锚定(Scroll Anchoring)**:在某些浏览器(如Chrome)中,滚动锚定功能会导致滚动条定位异常,从而不断触发加载。可以通过CSS属性`overflow-anchor: none;`来禁用。 4. **检查父容器高度和滚动**:确保无限滚动绑定的元素是实际发生滚动的元素,并且其父容器没有干扰滚动行为。如果滚动发生在祖先元素上,那么触底事件将无法正确触发。 5. **移动端特殊处理**:移动端可能存在触摸事件和滚动行为的差异,确保没有其他事件阻止了滚动事件的传播。 6. **检查加载状态**:确保在加载过程中,没有重复触发加载函数,可以通过控制`infinite-scroll-disabled`属性来管理。 根据以上分析,给出以下解决方案: ### 解决方案 #### 1. 确保正确的滚动容器 将`v-infinite-scroll`指令绑定在发生滚动的容器上,并设置该容器的高度和溢出样式。例如: ```html <div v-infinite-scroll="loadMore" infinite-scroll-disabled="disabled" infinite-scroll-distance="1" style="height: 100vh; overflow: auto;" > <!-- 内容 --> </div> ``` 注意:如果内容高度超出容器高度,就会产生滚动条。在移动端,通常使用视口高度(如100vh)作为容器高度。 #### 2. 设置触发距离 在移动端,由于滚动精度问题,可以设置`infinite-scroll-distance="1"`,这样在距离底部1个像素时就会触发加载,避免触底不触发的问题。 #### 3. 禁用滚动锚定 在滚动容器上添加CSS样式: ```css overflow-anchor: none; ``` 这样可以防止浏览器自动调整滚动位置,避免不断触发加载。 #### 4. 检查嵌套滚动容器 如果滚动容器嵌套在另一个滚动容器内,可能会导致触底事件无法触发。需要确保触底检测发生在最内层的滚动容器上,并且该容器是内容元素的直接父级。 #### 5. 代码示例 结合以上几点,一个完整的示例代码如下: ```vue <template> <div v-infinite-scroll="loadMore" infinite-scroll-disabled="disabled" infinite-scroll-distance="1" class="infinite-container" > <div v-for="(item, index) in list" :key="index"> {{ item }} </div> <div v-if="loading">加载中...</div> <div v-if="noMore">没有更多了</div> </div> </template> <script> import { ref, computed } from 'vue'; export default { setup() { const list = ref([]); const loading = ref(false); const count = ref(0); const loadMore = () => { loading.value = true; // 模拟异步请求 setTimeout(() => { for (let i = 0; i < 10; i++) { list.value.push(count.value++); } loading.value = false; }, 1000); }; const noMore = computed(() => count.value >= 50); const disabled = computed(() => loading.value || noMore.value); return { list, loading, disabled, noMore, loadMore }; } }; </script> <style scoped> .infinite-container { height: 100vh; /* 使用视口高度 */ overflow: auto; overflow-anchor: none; /* 禁用滚动锚定 */ } </style> ``` ### 注意事项 - 在移动端,确保页面没有其他因素(如弹窗、固定定位元素)影响滚动容器的滚动- 如果使用`el-table`等组件,需要确保表格的滚动容器正确设置,因为`el-table`有自己内部的滚动容器,可能需要使用`el-table-infinite-scroll`插件(如引用[2]所述)。 ### 相关问题 1. 在移动端使用无限滚动时,如何优化性能避免卡顿? 2. element-plus无限滚动在移动端有哪些已知的兼容性问题? 3. 如何实现无限滚动与分页加载的切换以适应不同场景? 以上解决方案和问题希望能帮助您解决移动端触底不刷新的问题。如果问题仍然存在,请检查浏览器兼容性或提供更多代码细节以便进一步排查。</think>### 解决 Element-Plus Infinite Scroll 在手机浏览器触底不刷新的方案 在移动端浏览器中,Element-Plus无限滚动组件(`v-infinite-scroll`)触底不刷新通常由以下原因导致: #### 📌 核心问题排查 1. **滚动容器识别错误**(最常见) - 移动端滚动通常在 `body/html` 层级,而 `v-infinite-scroll` 默认绑定在组件容器 - 需手动指定滚动容器:`infinite-scroll-container=".scroll-box"` 2. **触底精度问题** - 移动端滚动事件精度较低,需调整触发阈值: ```html <div v-infinite-scroll="load" infinite-scroll-distance="100" <!-- 增加触发距离 --> ></div> ``` 3. **CSS 滚动限制** - 父容器必须开启滚动:`overflow: auto` + 固定高度 - 禁用浏览器滚动锚定: ```css .scroll-container { overflow-anchor: none; /* 关键修复 */ height: 100vh; overflow: auto; } ``` #### ✅ 完整解决方案 ```vue <template> <!-- 指定滚动容器 --> <div class="scroll-container" ref="scrollBox"> <!-- 绑定到实际滚动元素 --> <div v-infinite-scroll="loadMore" infinite-scroll-disabled="disabled" infinite-scroll-distance="150" <!-- 移动端建议值 --> infinite-scroll-container=".scroll-container" <!-- 关键 --> > <div v-for="item in items" :key="item.id">{{ item.content }}</div> <div v-if="loading">加载中...</div> </div> </div> </template> <script setup> import { ref } from 'vue'; const items = ref([...]); const loading = ref(false); const disabled = ref(false); const loadMore = () => { if (disabled.value || loading.value) return; loading.value = true; // 模拟API请求 setTimeout(() => { items.value.push(...newData); loading.value = false; }, 1000); }; </script> <style scoped> .scroll-container { height: 100vh; /* 必须固定高度 */ overflow: auto; overflow-anchor: none; /* 禁用滚动锚定 */ -webkit-overflow-scrolling: touch; /* iOS滚动优化 */ } </style> ``` #### ⚠️ 移动端特殊注意事项 1. **iOS 弹性滚动修复** ```css body { overscroll-behavior-y: contain; /* 防止下拉刷新冲突 */ } ``` 2. **安卓浏览器兼容** ```js // 在mounted时手动初始化滚动 import { nextTick } from 'vue'; onMounted(() => { nextTick(() => { const container = document.querySelector('.scroll-container'); container.dispatchEvent(new CustomEvent('scroll')); }); }); ``` 3. **触底失效应急方案** ```html <!-- 添加备用滚动监听 --> <div @scroll.passive="handleManualScroll" class="scroll-container" > ``` ```js const handleManualScroll = (e) => { const { scrollTop, scrollHeight, clientHeight } = e.target; if (scrollHeight - scrollTop - clientHeight < 50) { loadMore(); } } ``` #### 💡 调试技巧 1. 在手机浏览器中开启远程调试(Chrome:`chrome://inspect`) 2. 检查滚动事件是否触发: ```js document.querySelector('.scroll-container') .addEventListener('scroll', console.log) ``` 3. 使用 `border: 1px solid red;` 高亮疑似滚动容器 > 引用说明:移动端滚动锚定问题参考 Chrome 56+ 行为[^1],容器嵌套规则参考 Element-UI 最佳实践[^4],触底精度方案参考社区经验[^3]。 --- ### 相关问题 1. 如何优化无限滚动在低端手机的性能? 2. Element-Plus 无限滚动与下拉刷新如何共存? 3. 移动端无限滚动导致内存暴涨如何处理? 4. 如何实现滚动到指定位置重新触发加载?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值