需求
- ant-design-vue select下拉列表当中动态加载列表,当滚动到最后的时候继续加载,没有数据了就不加载了
- 这里的
defHttp
就是axios的二次封装,你们可以替换为axios就可以 - 效果的话就不展示了,因为数据都是后台请求的~
做法
- 用到的
ant design vue
组件有a-spin
加载圈圈的a-select
下拉列表a-empty
空状态的(这里自定义了空状态,使其文字替换为加载圈圈)
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| const VNodes = (_, { attrs }) => { return attrs.vnodes; } <a-select v-model:value="searchForm.userIds" allow-clear mode="multiple" @dropdownVisibleChange="handleDropDownVisibleChange" @popupScroll="handlePopupScroll" :max-tag-count="1" :max-tag-text-length="2" placeholder="请选择"> <a-select-option v-for="item in dropDownData.options" :key="item.id" :value="item.id"> {{item.name}} </a-select-option> <template #dropdownRender="{ menuNode: menu }"> <a-empty v-if="dropDownData.isLoading"> <template #description> <span><a-spin /></span> </template> </a-empty> <a-empty v-else-if="dropDownData.options.length === 0"> <template #description> 暂无数据 </template> </a-empty> <template v-else> <v-nodes :vnodes="menu" /> </template> </template> </a-select>
const searchForm = ref<SearchFormTypes>({ userName:'', userIds:[], });
const handleDropDownVisibleChange = async (open) => { if(open && dropDownData.value.options.length === 0 ){ const result = await defHttp.post(({url:'/xxxx',params:{userName:searchForm.value.userName,...dropDownData.value.pagination}})); dropDownData.value.pagination.total = result.total ?? 0; dropDownData.value.isLoading = false; dropDownData.value.options = result?.list?.map(item => ({ id:item.id ?? 0, name:item.name ?? "", })) ?? []; } }
const handlePopupScroll = async (e) => { if(dropDownData.value.options.length >= dropDownData.value.pagination.total) return; const { scrollHeight, scrollTop, clientHeight } = e.target; if (scrollHeight - scrollTop === clientHeight) { dropDownData.value.pagination.page++; const result = await defHttp.post(({url:'/xxxxx',params:{userName:searchForm.value.userName,...dropDownData.value.pagination}})); const temp = result?.list?.map(item => ({ id:item.id ?? 0, name:item.name ?? "", })) ?? []; dropDownData.value.options = [...dropDownData.value.options,...temp]; } }
const dropDownData = ref<dropDownDataTypes>({ options:[], pagination:{ page:1, pageSize:10, total:0, }, isLoading:true, })
|
回调说明和其他的一些说明
@dropdownVisibleChange="handleDropDownVisibleChange"
初次选择下拉列表的时候执行,可以用于初始化数据@popupScroll="handlePopupScroll"
下拉列表滚动的时候执行的回调,用于判断是否加载到了底部<v-nodes :vnodes="menu" />
这个代表的就是那个下拉列表项数据,没有这个就不渲染
参考文章
https://blog.csdn.net/qq_36437172/article/details/109515201