uniapp:在子组件中实现下拉加载(onReachBottom)和上拉刷新(onPullDownRefresh)

多个页面的页面结构完全相同,仅仅背景图和获取的列表数据不同,因此抽出一个公共组件,该组件占据整个父页面,根据父页面传入不同的参数向接口请求不同的列表数据。

现在想实现页面的下拉加载和上拉刷新功能,因为数据在子组件中请求,所以必须在子组件中实现上拉加载和下拉刷新,而onReachBottom和onPullDownRefresh又是页面内的处理函数,无法直接应用于组件中。

本篇文章借助uni.$emit()、uni.$on()和uni.$off()实现uniapp在子组件中下拉加载(onReachBottom)和上拉刷新(onPullDownRefresh)。


首先在pages.json中引入相关配置

// pages.json
{
  "path": "pages/resInfo/resPage", // 页面文件路径
  style": {
    "navigationBarTitleText": "我是页面标题"
    "enablePullDownRefresh": true, // 开启该页面下拉刷新,默认false
    "onReachBottomDistance": 100 // onReachBottom事件触发时距页面底部距离,默认50,单位px
  }
},
父页面:设置监听事件,onReachBottom和onPullDownRefresh与methods同级
// 父页面  
onReachBottom() {
  uni.$emit('onReachBottom') // 设置监听事件
},
onPullDownRefresh() {
  uni.$emit('onPullDownRefresh') // 设置监听事件
}
子组件:页面挂载前开始监听,离开页面时销毁监听,在uni.$on()的回调函数中进行上拉加载和下拉刷新操作,同样与methods同级
// 子组件
beforeMount() {
  uni.$on('onReachBottom', () => { // 监听上拉加载
    console.log("到达底部,onReachBottom")
  })
  uni.$on('onPullDownRefresh', () => { // 监听下拉刷新
    console.log("进行了上拉刷新,onPullDownRefresh")
  })
},
destroyed() {
  uni.$off('onReachBottom') // 销毁onReachBottom监听
  uni.$off('onPullDownRefresh') // 销毁onPullDownRefresh
}

  附上uniapp官网链接:uniapp官方文档onReachBottom介绍 | onPullDownRefresh | uni.$emit()、uni.$on()、uni.$off()

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
uniapp,可以使用内置的组件`<scroll-view>`来实现刷新下拉加载。具体步骤如下: 1. 在`<scroll-view>`标签添加`@scrolltolower`事件和`@scrolltoupper`事件,分别表示滚动到底部和顶部时触发的事件。 2. 在事件处理函数,可以调用相应的方法来实现刷新下拉加载。 例如,可以使用`uni.request()`方法发送请求获取数据,然后将数据添加到页面的数据列表,最后调用`uni.stopPullDownRefresh()`方法停止下拉刷新动画。 示例代码如下: ```html <template> <scroll-view class="list" :style="{height:height+'px'}" scroll-y @scrolltolower="loadMore" @scrolltoupper="refresh"> <ul> <li v-for="(item,index) in list" :key="index">{{item}}</li> </ul> </scroll-view> </template> <script> export default { data() { return { list: [], // 数据列表 page: 1, // 当前页数 limit: 10, // 每页数据条数 height: 0 // scroll-view的高度 } }, mounted() { // 获取 scroll-view 的高度 uni.getSystemInfo({ success: res => { this.height = res.windowHeight } }) // 页面初始化时加载数据 this.loadData() }, methods: { // 加载数据 loadData() { uni.request({ url: 'https://xxx.com/api/list', data: { page: this.page, limit: this.limit }, success: res => { this.list = this.list.concat(res.data) } }) }, // 下拉刷新 refresh() { this.page = 1 this.list = [] this.loadData() uni.stopPullDownRefresh() }, // 上加载更多 loadMore() { this.page++ this.loadData() } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值