当前位置: 首页 > news >正文

关于pc端分页+h5端加载更多的vue3简单钩子函数

 1.pc端分页+h5端加载更多钩子函数:

import { ref, onMounted, toRefs, watch } from 'vue'interface IremoteFn {remoteFn: (arg1: any) => Promise<any>emit: any
}
const useListPage = (props: any, { remoteFn, emit }: IremoteFn) => {const { list } = toRefs(props)interface IPaginationProp {pageNum: numberpageSize: numbertotal: string | number}const loadAll = ref(false)const loading = ref(false)const pagination = ref<IPaginationProp>({pageSize: 10,total: 0,pageNum: 1})const dataList = ref<any[]>([])// h5端上滑加载更多const loadMore = () => {if (loading.value) returnpagination.value.pageNum = pagination.value.pageNum + 1initData()}// 初始化数据(h5端下拉刷新)const onLoad = () => {pagination.value.pageNum = 1dataList.value = []initData()}// pc分页-改变pageNum回调const handleCurrentChange = (pageNum: number) => {pagination.value.pageNum = pageNumdataList.value = []initData()}// pc分页-pageSize回调const handleSizeChange = (pageSize: number) => {pagination.value.pageSize = pageSizepagination.value.pageNum = 1dataList.value = []initData()}// 调用分页接口const initData = () => {if (loading.value) {return}loading.value = trueemit('showLoading')remoteFn({pageNo: pagination.value.pageNum,pageSize: pagination.value.pageSize}).then((res) => {loading.value = falseconst { list = [], total } = resif (pagination.value.pageNum == 1) {dataList.value = list || []} else {dataList.value = dataList.value.concat(list)if(list.length < pagination.value.pageSize) {loadAll.value = true}}pagination.value.total = Number(total)if (dataList.value.length >= total) {loadAll.value = true}}).finally(() => {loading.value = falseemit('hideLoading')})}onMounted(() => {onLoad()})watch(() => list.value,() => {if (list.value) {dataList.value = list.value || []}},{deep: true,immediate: true})return {loadAll,loading,pagination,dataList,loadMore,onLoad,handleCurrentChange,handleSizeChange}
}export default useListPage

使用钩子:

const props = defineProps<{list?: any[]
}>()const { list } = toRefs(props)const emit = defineEmits(['showLoading', 'hideLoading'])
// 按需获取值和方法
const { handleSizeChange, handleCurrentChange, dataList, pagination } = useListPage(props, {emit,remoteFn: xxx方法
})

2.下拉刷新+上滑加载更多组件:

<template><van-pull-refresh v-model="refreshing" @refresh="onRefresh"><van-list v-model="loading" :finished="finished" :finished-text="finishedText" @load="loadMore"><slot name="content"></slot></van-list></van-pull-refresh>
</template><script lang="ts" setup>
import { ref, toRefs } from 'vue'
const props = defineProps<{finished: booleanfinishedText?: string
}>()
const { finished } = toRefs(props)
const emit = defineEmits(['fetchData', 'onLoad'])const loading = ref<boolean>(false)
const refreshing = ref<boolean>(false)async function loadMore() {if (loading.value) returnloading.value = truetry {await emit('fetchData')} finally {loading.value = false}
}async function onRefresh() {refreshing.value = trueawait emit('onLoad')refreshing.value = false
}
</script>
<style lang="less" scoped>
:deep(.van-list .van-list__finished-text) {font-size: 12px;line-height: 20px;margin-top: 8px;
}
</style>

3.h5页面使用:

<template><ListRefresh:finished="loadAll":finishedText="finishedText"@fetch-data="loadMore"@on-load="onLoad"><template #content><div class="list"><div class="list-box" v-if="dataList && dataList.length > 0"><div class="item" v-for="item in dataList" :key="item">{{ item.xxx }}</div></div><div v-else class="not-data">暂无数据</div><div v-if="!loadAll && dataList.length > 0" class="more-btn" @click="loadMore"><van-loading v-if="loading" size="14px" type="spinner">加载中</van-loading><span v-else>查看更多</span></div></div></template></ListRefresh>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { remoteFn } from '@/api'
import ListRefresh from '../ListRefresh.vue'
import useListPage from '../../hooks/useListPage'const props = defineProps<{list?: any[]
}>()const emit = defineEmits(['showLoading', 'hideLoading'])
const { loadAll, loading, dataList, loadMore, onLoad } = useListPage(props, {emit,remoteFn
})const finishedText = computed(() => {return loadAll.value && dataList.value.length > 0 ? '没有更多了' : ''
})
</script>
<style lang="less" scoped></style>

4.pc端使用:

<template><div class="content"><div class="c-table"><div class="c-thead"><div class="c-tr"><div class="c-td enroll-date">开始日期</div><div class="c-td graduate-date">结束日期</div></div></div><div class="c-tbody" v-if="dataList && dataList.length > 0"><div class="c-tr" v-for="item in dataList" :key="item"><div class="c-td">{{ item.startDate }}</div><div class="c-td">{{ item.endDate }}</div></div></div><div class="no-data" v-else>暂无数据</div></div><div class="buttom-box"><el-config-provider :locale="ZH_CH"><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="pagination.pageNum":page-sizes="[10, 20, 50, 100]":page-size="pagination.pageSize":layout="'total, sizes, prev, pager, next, jumper'":total="pagination.total"></el-pagination></el-config-provider></div></div>
</template>
<script setup lang="ts" name="xxx">
import { ElPagination, ElConfigProvider } from 'element-plus'
import ZH_CH from 'element-plus/lib/locale/lang/zh-cn'
import { remoteFn} from '@/api'
import useListPage from './useListPage'const props = defineProps<{list?: any[]
}>()const emit = defineEmits(['showLoading', 'hideLoading'])
const { handleSizeChange, handleCurrentChange, dataList, pagination } = useListPage(props, {emit,remoteFn
})
</script>

http://www.dtcms.com/a/390112.html

相关文章:

  • MySQL 练习题
  • 推客小程序二级分销机制设计与实现:从0到1搭建裂变增长引擎
  • 【C++】多态(上)
  • uos中创建自定义Ip (192.168.137.1)的热点的方法
  • 【每日算法】搜索插入位置 LeetCode
  • vue+springboot+ngnix前后端分离项目部署
  • sward入门到实战(1) - 安装教程
  • 独立站的优势有哪些
  • Java学习历程18——哈希表的使用
  • 机械传动里的名词——传动比
  • qiankun 主子应用部署教程(Nginx 小白版)
  • 开启视觉奇旅:走进《计算机图形学》的世界
  • 光伏组件IV曲线测试仪的功能
  • MySQL MHA
  • 【试题】信息安全管理员考试题库
  • 硬件(十四)SPI通信协议
  • 大模型学习:使用FastText工具进行文本分类
  • pip 指令大全
  • 计算机基础·MySQL
  • 22-29、深度学习知识手册:从全连接到生成模型的融会贯通指南
  • 【FastCAEFlow案例分享】软件在汽车场景中的应用
  • Python二进制数据读取与可变缓冲区操作详解:从基础到高阶应用
  • 面向对象编程(OOP):Java 的核心思想(详细笔记)
  • I2C 通信、AT24C02 EEPROM及LM75温度传感器的配置
  • Halcon中的并行编程(二)
  • Gin框架参数绑定完全指南:从基础到实战最佳实践
  • TF 坐标旋转的方向如何确定
  • C++基础(16)——用红黑树封装出map和set
  • 前端编程工具有哪些?常用前端编程工具推荐、前端编程工具对比与最佳实践分享
  • 换网络这事, Comcast 销户了