uni-app 新闻资讯App模板 增加refresh功能后下拉加载更多会跳回顶部
uni-app 新闻资讯App模板 增加refresh功能后下拉加载更多会跳回顶部
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Mac | Monterey | HBuilderX |
产品分类:uniapp/App
测试过的手机:
- iphone6
- iphone13
- 模拟器
操作步骤:
- 新闻资讯App模板
https://ext.dcloud.net.cn/plugin?id=103 - 如果自己加上刷新功能
例如<refresh :display="refreshing" [@refresh](/user/refresh)="onrefresh" [@pullingdown](/user/pullingdown)="onpullingdown"></refresh>
预期结果:
- 上拉加载更多不会跳回顶部
- 下拉刷新可以工作
实际结果:
- 上拉加载更多跳回顶部
bug描述:
- 新闻资讯App模板
https://ext.dcloud.net.cn/plugin?id=103 - APP-NVUE:
模版本身只有加载更多, 没有下拉刷新功能. - 如果自己加上刷新功能
例如<refresh :display="refreshing" [@refresh](/user/refresh)="onrefresh" [@pullingdown](/user/pullingdown)="onpullingdown"></refresh>
更多关于uni-app 新闻资讯App模板 增加refresh功能后下拉加载更多会跳回顶部的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
请提供修改后的完整代码
更多关于uni-app 新闻资讯App模板 增加refresh功能后下拉加载更多会跳回顶部的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这个问题是由于在 nvue 页面中同时使用了 <refresh> 和 <list> 组件时,默认的滚动行为冲突导致的。
核心原因:
在 nvue 中,<refresh> 组件需要包裹可滚动区域(如 <list> 或 <scroll-view>)才能正常工作。但新闻资讯模板原生的 <list> 组件已经自带了滚动能力,当外层再添加 <refresh> 后,会形成嵌套滚动容器,导致滚动位置计算异常,从而触发跳回顶部的行为。
解决方案:
需要修改页面结构,将 <refresh> 作为 <list> 的父容器,并正确配置 <list> 的 loadmoreoffset 属性。
- 调整模板结构:
<template>
<refresh class="refresh" :display="refreshing" @refresh="onrefresh" @pullingdown="onpullingdown">
<list class="list" loadmoreoffset="15" @loadmore="onloadmore">
<!-- 原有的列表内容 -->
<cell v-for="(item, index) in list" :key="index">
<!-- 新闻项内容 -->
</cell>
<!-- 加载更多提示 -->
<loading class="loading" @loading="onloading" :display="loadinging">
<text class="indicator-text">加载中...</text>
<loading-indicator class="indicator"></loading-indicator>
</loading>
</list>
</refresh>
</template>
- 关键配置说明:
loadmoreoffset="15":设置列表距离底部多少像素时触发loadmore事件,这个值需要根据实际情况调整- 确保
<refresh>直接包裹<list>,不要有其他中间容器
- 样式调整:
.refresh {
flex: 1;
}
.list {
flex: 1;
}
- JavaScript 逻辑调整:
export default {
data() {
return {
refreshing: 'hide',
loadinging: 'hide',
list: []
}
},
methods: {
onrefresh() {
this.refreshing = 'show'
// 执行刷新逻辑
setTimeout(() => {
this.refreshing = 'hide'
}, 1000)
},
onloadmore() {
this.loadinging = 'show'
// 执行加载更多逻辑
setTimeout(() => {
this.loadinging = 'hide'
}, 1000)
}
}
}

