uni小程序上拉加载下拉刷新实现

vue3+TS+uni小程序实现上拉加载下拉刷新

话不多说直接上代码

index.vue

<template>
	<view class="list-wrap">
	      <view class="club-posts-list-container" v-if="list.length && list.length > 0">
	        <view class="club-posts-list">
	          <posts_item v-for="(item, index) in list" :key="item.postsId" :detail="item.content" :index="index" />
	        </view>
	        <uni-load-more
	          :status="isLoaded ? 'noMore' : loading ? 'loading' : 'more'"
	          iconType="circle"
	          :iconSize="16"
	          color="#999999"
	        />
	      </view>
	</view>
</template>

<script lang="ts">
  import { defineComponent, ref, toRefs, onMounted } from 'vue'
  import { useRecommendPosts } from '@/pages/home/hook/useRecommendTopic'
  import { onPullDownRefresh } from '@dcloudio/uni-app'
  export default defineComponent({
    name: 'Index',
    setup() {
      const { clubPostsListData, getTopicPostsList, reloadHomeData } = useRecommendPosts()
      onMounted(() => {
        getTopicPostsList()
      })
      onPullDownRefresh(() => {
        reloadHomeData()
      })
      return {
        ...toRefs(clubPostsListData)
      }
    },
    // 触底加载
    onReachBottom() {
      this.getTopicPostsList()
    }
  })
</script>

useRecommendTopic.ts

import { reactive } from 'vue'
import { ClubPostsListResType, getIndexRecPostsList as getIndexRecPostsListApi } from '@/http/modules/clubPost'
// import { useGetters } from '@/store/use'

// 列表数据
interface ClubPostsListData<T> {
  list: Array<T>
  total: number
  isLoaded: boolean
  currentPage: number
  size: number
  loading: boolean
  activeId: number
}

interface Result {
  clubPostsListData: ClubPostsListData<ClubPostsListResType>
  reloadHomeData: (type: number, callBack?: Function) => void
  getTopicPostsList: (callBack?: Function) => Promise<void>
}

export const useRecommendPosts = (): Result => {
  // const storeGetters = useGetters('basic', ['appletInfo'])

  // 帖子数据定义
  const clubPostsListData = reactive<any>({
    list: [], // 帖子列表
    total: 0, // 总数
    isLoaded: false, // 是否加载完成
    currentPage: 1, // 当前页
    size: 10, // 每页数据
    loading: false, // 是否正在加载
    activeId: 0 // 当前帖子列表所在tab 0最新 | 1精华
  })

  // 获取话题对应帖子列表
  const getTopicPostsList = async (callBack?: Function): Promise<void> => {
    try {
      if (clubPostsListData.isLoaded) return
      clubPostsListData.loading = true
      const { code, data } = await getIndexRecPostsListApi({
        userId: '1069',
        page: clubPostsListData.currentPage,
        pageSize: clubPostsListData.size
      })
      if (code !== 10000) return
      clubPostsListData.list = [...clubPostsListData.list, ...data.items]
      clubPostsListData.total = data.total
      clubPostsListData.loading = false
      /**
      	*控制是否加载完成
      	*/
      if (clubPostsListData.currentPage * clubPostsListData.size >= data.total) {
        clubPostsListData.isLoaded = true
      } else {
        clubPostsListData.currentPage++
      }
      callBack && callBack()
    } catch (error) {
      console.log(error)
    }
  }

  // 重新加载列表数据(下拉刷新或者首次加载的时候可以用)
  const reloadHomeData = (type: number, callBack?: Function): void => {
    clubPostsListData.activeId = type
    clubPostsListData.list = []
    clubPostsListData.total = 0
    clubPostsListData.isLoaded = false
    clubPostsListData.currentPage = 1
    clubPostsListData.size = 10
    clubPostsListData.loading = false
    callBack ? getTopicPostsList(callBack) : getTopicPostsList()
  }
  
	/**
	*把页面中要用的数据可方法return出去
	*/

  return {
    clubPostsListData,
    getTopicPostsList,
    reloadHomeData
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值