vue3——利用自定义指令实现下拉框分页懒加载
创始人
2024-12-13 03:37:20
0

需求:下拉框一开始请求第一页的内容,滚动到最后的时候,请求第二页的内容,如此反复,直到所有数据加载完成。

selectLoadMore.ts

//自定义指令:实现下拉框下拉到末尾时,加载下一页的内容 // 使用时传两个参数,一个是下拉框的class,一个是下拉框滚动到末尾时触发的函数,比如: // v-el-select-loadmore="{ //   selector: '.myOption .el-select-dropdown .el-select-dropdown__wrap', //   loadFunction: loadMore // }" export default {   mounted(el, binding) {     //解构传来的值     const {       value: { selector, loadFunction }     } = binding     const SELECTWRAP_DOM = document.querySelector(selector)     if (SELECTWRAP_DOM) {       // 监听事件的处理函数,把函数单独写出来,方便销毁       const scrollHandler = () => {         const condition = SELECTWRAP_DOM.scrollTop + SELECTWRAP_DOM.clientHeight >= SELECTWRAP_DOM.scrollHeight - 1         if (condition) {           loadFunction()         }       }       //赋值,为了方便销毁,这里很重要,不然销毁的时候找不到dom和对应的回调函数!!!       el.dom = SELECTWRAP_DOM       el.event = scrollHandler       //监听滚动事件       SELECTWRAP_DOM.addEventListener('scroll', scrollHandler)     }   }, //销毁,会在关闭弹窗时触发(这里的el-select写在弹窗里)   beforeUnmount(el) {     if (el.dom) {       el.dom.removeEventListener('scroll', el.event)     }   } }

记得在main.ts里面注册成全局组件!!!! 

main.ts

import vElSelectLoadmore from '@/utils/tools/selectLoadMore' app.directive('el-select-loadmore', vElSelectLoadmore) //全局自定义指令 app.mount('#app') 

使用的vue文件 

//使用时在指令里传值,这里有个坑! //在el-select给一个参数popper-class="myOption",因为element-plus中ei-select的选项是使用的popper.js生成的,无法直接获取,直接获取下拉框的dom获取不到                                     //总共的数据条数 let totalCount: number = 0 //当前滚动页 let page: number  /**  * 自定义指令触发的回调  */ function loadMore() {   //计算总页数   let maxPagSize: number = Math.max(Math.ceil(totalCount / 10), 1)   //不超过总页数才发请求   if (page < maxPagSize) {     page += 1     //发请求,获得接口数据     getUserListWrap(page, 10)   } }  /**  * 控制下拉框loding是否出现,isOptionLoading是在getUserListWrap请求函数里面的,userData是请求函数获得是下拉框数据,这样可以使下拉到最后一个option的时候,出现loding效果,更加完善美观  * @param index 下拉框循环的index  */ function optionLoading(index: number): boolean {   if (isOptionLoading.value && index == userData.length - 1) {     return true   } else {     return false   } }

总结:

1、 在el-select给一个参数popper-class="myOption",因为element-plus中el-select的选项是使用的popper.js生成的,无法直接获取,直接获取下拉框的dom获取不到

2、在自定义指令里面销毁事件的时候,在mounted必须把事件存在el上,不然不好销毁,一开始是以下这么写的:发现这样不好销毁,因为在 beforeUnmount拿不到function,this只能按以下这么写才行,如果单独把funtion拎出来,this就报错找不到

export default {   mounted(el, binding) {     const {       value: { selector, loadFunction }     } = binding     const SELECTWRAP_DOM = document.querySelector(selector)      if (SELECTWRAP_DOM) {       SELECTWRAP_DOM.addEventListener('scroll', function () {         const condition = this.scrollTop + this.clientHeight >= this.scrollHeight - 1         if (condition) {           loadFunction()         }       })     }   } }

 vue3的demo代码如下:

   

相关内容

热门资讯

第8分钟了解!老友赣州麻将破解... 第8分钟了解!老友赣州麻将破解版(辅助)泸州大贰麻将开挂辅助神器-好像有挂脚本老友赣州麻将破解版脚本...
第6分钟了解!微信小游戏辅助器... 第6分钟了解!微信小游戏辅助器(辅助)NG-poker开挂辅助修改器-切实有挂神器微信小游戏辅助器是...
第6分钟了解!山西扣点辅助工具... 第6分钟了解!山西扣点辅助工具(辅助)H5开挂辅助安装-真是是真的安装1、上手简单,内置详细流程视频...
五分钟了解!拱趴大菠萝辅助工具... 五分钟了解!拱趴大菠萝辅助工具下载(辅助)大懒人娱乐开挂辅助辅助器-真是是真的辅助器1、在拱趴大菠萝...
七分钟了解!微信小程序青龙大厅... 七分钟了解!微信小程序青龙大厅辅助(辅助)开心娱乐开挂辅助软件-真是真的是有平台亲,关键说明,微信小...
5分钟了解!永久免费脚本辅助工... 5分钟了解!永久免费脚本辅助工具(辅助)温州茶苑开挂辅助插件-切实真的是有脚本亲,关键说明,永久免费...
五分钟了解!wepoker辅助... 五分钟了解!wepoker辅助器(辅助)华龙棋牌开挂辅助脚本-本来存在有软件运wepoker辅助器辅...
2分钟了解!闲闲辅助器(辅助)... 2分钟了解!闲闲辅助器(辅助)衡阳丫丫竞技开挂辅助修改器-竟然是有下载1、全新机制【闲闲辅助器ai辅...
第二分钟了解!四川游戏家园修改... 第二分钟了解!四川游戏家园修改器(辅助)福友开挂辅助插件-好像有挂辅助1、在四川游戏家园修改器插件功...
第六分钟了解!多乐辅助下载够机... 第六分钟了解!多乐辅助下载够机(辅助)皇豪互娱开挂辅助脚本-其实存在有辅助1、玩家可以在多乐辅助下载...