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

Element-Plus: Select组件实现滚动分页加载

Element-Plus的select组件并没有自带滚动分页加载的功能,其虽然提供了自定义下拉菜单的底部的方式可以自定义上一页下一页操作按钮的方式进行分页加载切换:
在这里插入图片描述
但如果不想通过点击分页按钮的方式,利用滚动触底进行下一页加载的话,可以利用Vue自定义指令实现:

自定义指定的实现方式,在网络上已经有实现的代码了,只不过需要在<el-select>上添加指定的popper-class(比如:popper-class=“single-select-loadmore”),这样做主要是因为<el-select>默认是将下拉列表插入至 body 元素(teleported=true),为了获取下拉列表的实际Dom对象而额外添加了popper-class

 const selectDom = document.querySelector('.single-select-loadmore .el-select-dropdown__wrap')

这样做略显麻烦,不够灵活。那么有没有办法,不设置额外的popper-class来获取到对应的下拉列表的Dom元素呢?Element-Plus文档并没有相关获取下拉列表Dom的相关属性,并且在<el-select>渲染的Dom和下拉列表的Dom元素在审查代码时也没有发现明显的关联性。但通过对mounted周期调试,发现了埋藏深处的popperRef.contentRef正是我们要找的下拉列表的Dom,于是代码可以这样实现:

// src/directive/elSelectLoadMore.jsexport default {mounted(el, binding, vnode) {const selectDom = vnode.children[0].component.refs.popperRef.contentRef.querySelector('.el-select-dropdown .el-select-dropdown__wrap');function loadMores() {// 判断是否到底const isBottom = this.scrollHeight - this.scrollTop <= this.clientHeight;if (isBottom) {// 执行事件回调binding.value && binding.value();}}// 将获取到的dom和函数挂载到el-select上,以便实例销毁时进行事件移除处理el._selectDom = selectDom;el._selectLoadMore = loadMores;// 监听滚动事件selectDom?.addEventListener('scroll', loadMores.bind(selectDom));},// 实例销毁beforeUnmount(el) {if (el._selectLoadMore) {el._selectDom.removeEventListener('scroll', el._selectLoadMore);delete el._selectDom;delete el._selectLoadMore;}}
}
// src/directive/index.jsimport elSelectLoadMore from './common/elSelectLoadMore'export default function directive(app){app.directive('selectLoadmore', elSelectLoadMore)
}
// src/main.jsimport App from './App'
import directive from './directive'const app = createApp(App)
directive(app)

经过简单测试,上述代码可以正常实现分页。需要注意的是上述selectDom的获取方式没有经过充分测试,只作为实验性代码。

相关文章:

  • Python笔记|字符串的转义
  • 09-设计模式 企业场景 面试题
  • PTA L1-079 天梯赛的善良(C++)
  • MySQL一些命令记录
  • R在直方图上添加一个更平滑的密度曲线
  • PCM和I2S区别
  • 实现真正的高性能高并发的上亿级别秒杀系统!!!
  • 姿态旋转的哥氏定理以及速度微分的推导
  • 蓝桥杯---棋盘(典型的二维差分问题)
  • 利用 Python 处理遥感影像数据:计算年度平均影像
  • Word中解决插入脚注导致的分页位置错误问题
  • 【消息队列开发】 实现内存加载
  • 【STL容器】Map使用介绍补充说明
  • MongoDB实战面试指南:常见问题一网打尽
  • 华为配置ISP选路实现报文按运营商转发
  • [译]Python中的类属性与实例属性的区别
  • Asm.js的简单介绍
  • Go 语言编译器的 //go: 详解
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java小白进阶笔记(3)-初级面向对象
  • JS笔记四:作用域、变量(函数)提升
  • LintCode 31. partitionArray 数组划分
  • Linux CTF 逆向入门
  • Next.js之基础概念(二)
  • Python学习之路16-使用API
  • React as a UI Runtime(五、列表)
  • TCP拥塞控制
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 阿里云前端周刊 - 第 26 期
  • 构建二叉树进行数值数组的去重及优化
  • 什么软件可以剪辑音乐?
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 正则学习笔记
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • (poj1.2.1)1970(筛选法模拟)
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (七)Java对象在Hibernate持久化层的状态
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)菜鸟学数据库(三)——存储过程
  • (转)大道至简,职场上做人做事做管理
  • .Net 8.0 新的变化
  • .NET 回调、接口回调、 委托
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .stream().map与.stream().flatMap的使用
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [Android Studio] 开发Java 程序
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)