<van-empty v-if="state.pageStatus === 'loading'" description="加载中..." />
<van-empty v-if="state.pageStatus === 'empty'" description="暂无数据" />
<van-list
v-if="state.pageStatus === 'normal'"
v-model:loading="state.isLoading"
ref="vantList"
:offset="30"
:immediate-check="false"
:finished="state.finished"
finished-text="没有更多了"
@load="onLoad"
>
<docCard v-for="(item, index) in state.HCPList" :key="index" :data="item" @click="toView(item)" @changeFocus="changeFocus"></docCard>
</van-list>
<script setup>
import { reactive } from 'vue'
const state = reactive({
HCPList: [], //数据
isLoading: false, // 列表的loading
finished: false, //结束
total: 0, //总数
pageStatus: 'loading', //加载中提示
page: 0,
size: 10
})
//获取数据
const findDoctorTable = async () => {
const query = {}//请求传参
try {
const res = await proxy.$api.doctor.getDoctorListNew(query)
const rows = res.result.doctors
state.isLoading = false
state.total = res.result.total
if (rows == null || rows.length === 0) {
state.pageStatus = 'empty'
state.finished = true
return
}
state.HCPList = state.HCPList.concat(rows)
state.pageStatus = 'normal'
state.finished = false
if (state.HCPList.length >= state.total) {
state.finished = true
}
} catch (error) {
state.isLoading = false
state.finished = true
}
}
// 筛选确认
const confirmDepartment = Json => {
resetQuery()
findDoctorTable()
}
const onLoad = () => {
state.page++
findDoctorTable()
}
const resetQuery = () => {
state.pageStatus = 'loading'
state.HCPList = []
state.page = 1
}
</script>
van-empty是 Vant 提供的组件,用于显示空数据或加载中的提示。在这里,通过v-if指令来根据state.pageStatus的值来判断显示哪种提示。如果state.pageStatus的值为'loading',则显示 "加载中..." 的提示;如果state.pageStatus的值为'empty',则显示 "暂无数据" 的提示。van-list也是 Vant 提供的组件,用于显示数据列表,并支持滚动加载更多数据。在这里,通过v-if指令来根据state.pageStatus的值来判断是否显示正常的数据列表。当state.pageStatus的值为'normal'时,显示数据列表。v-model:loading="state.isLoading"绑定了van-list组件的loading属性到state.isLoading。这表示当state.isLoading的值为true时,列表会处于加载状态。ref="vantList"给van-list组件设置了一个引用,这样我们可以通过该引用访问van-list组件的方法和属性。:offset="30"设置了滚动加载时的阈值,表示当列表滚动到底部距离底部还有 30px 时,会触发加载更多数据的操作。:immediate-check="false"表示在初始化时不立即触发加载更多数据的操作。:finished="state.finished"绑定了van-list组件的finished属性到state.finished。当state.finished的值为true时,表示数据已加载完毕,无需再触发加载更多数据。finished-text="没有更多了"设置了数据加载完毕时的文本提示。@load="onLoad"绑定了van-list组件的load事件到onLoad方法。当滚动加载触发时,会调用onLoad方法。- 在
van-list内部使用v-for循环遍历state.HCPList中的数据,生成多个docCard组件。docCard组件的数据来源是state.HCPList中的每个元素,每个docCard组件都会有一个唯一的:key绑定,以优化渲染性能。
总体来说,<template> 部分的代码根据 state.pageStatus 的值来显示不同的提示信息或数据列表。数据列表支持滚动加载更多数据,直到数据全部加载完毕(state.finished 为 true)为止。
- 在
<script setup>部分,我们使用了import { reactive } from 'vue'导入了reactive函数,用于创建响应式数据对象。 state是一个响应式数据对象,其中包含了组件内部使用的状态信息,如HCPList(数据列表)、isLoading(列表的加载状态)、finished(数据是否已加载完毕)、total(总数据量)、pageStatus(页面加载状态)、page(当前页码)、size(每页数据条数)等。findDoctorTable是一个异步函数,用于获取数据。它会根据query对象向服务器发送请求,并根据响应结果更新state中的相关状态。如果获取到数据,则将其添加到HCPList中,并将pageStatus设置为 'normal',如果没有数据,则将pageStatus设置为 'empty',同时设置finished为true表示数据加载完毕。confirmDepartment是一个函数,用于确认部门筛选条件。它会重置查询参数并调用findDoctorTable方法重新获取数据。onLoad是一个函数,在滚动加载时触发。它会将page自增 1,并调用findDoctorTable方法获取更多数据。resetQuery是一个函数,用于重置查询参数和状态。在重新加载数据时,它会将HCPList清空,page设为 1,pageStatus设为 'loading'。
总体来说,这个组件实现了根据不同的页面加载状态显示不同的内容,可以根据不同条件向服务器请求数据,并在滚动加载时获取更多数据。在数据加载过程中,会显示适当的提示信息,如 "加载中..." 或 "暂无数据"。