ElementPlus 中el-select自定义指令实现触底加载请求options数据
1) 背景:
老项目翻新时,发现一个下拉框数据非常多,客户呢,希望全部数据一起展示,意思就是全部数据一起返回给前端用于展示。但这会造成明显的卡顿。~~明显的不合理! QAQ!~~ 
于是压力给到前端,查询资料,各种搜索,最终找到2个解决方案。
1、在el-select下拉框中添加分页组件,让用户点击下一页下一页
2、在el-select下拉框中数据,触底加载
当然最终选择了第二个方案,用户体验会更好。
由于项目中有多个地方使用到 且 可能单个页面中会用到多次,为了复用选择了自定义指令的方式去实现。
2) 先来看看实现的效果

3) 思路
- 触底加载,哪个元素滚动触底时加载?
- 承装下拉框中所有元素的容器(.el-scrollbar__wrap)
- 触底时,触发方法做什么?
- 触底时,继续向后端发请求获取下一页的数据,请求回来的数据合并给options
4) 简单的写一下.vue文件代码
接口数据是自己用node写的
后端代码在这里:GitHub - stella99888/tao-express: Vue2+Express
```javascript<!-- 下拉框触底加载页面 --><template><div class="m-4"><p>第一个select</p><el-select v-model="value" v-loadmore="loadmore" :teleported="false" style="width:240px"><el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /></el-select><p>第二个select</p><el-select v-model="value" v-loadmore="loadmore" :teleported="false" style="width:240px"><el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /></el-select></div></template><script setup>
import axios from 'axios';
import { onMounted, reactive, ref } from 'vue'const list = ref([])
const options = ref([])
const option = ref([])
const value = ref([])
const loading = ref(false)
let pageData = reactive({pageIndex: 1,pageSize: 10
})
onMounted(() => {getOptions()
})
const getOptions = () => {axios.get(`http://localhost:9999/getSelectOptions?pageIndex=${pageData.pageIndex}&pageSize=${pageData.pageSize}`).then(res => {console.log(res.data);if (res.data.length < 1) {ElMessage({message: '没有更多数据了...',type: "warning",});}const newOptions = res.data.map((item) => {return { value: item.name, label: item.index }})options.value.push(...newOptions)})
}
// 触底了,继续发请求
const loadmore = () => {pageData.pageIndex = pageData.pageIndex + 1getOptions()
}
</script>
* 注意一下:
1. teleported属性为官网提供,是否将下拉列表插入至 body 元素,默认值为true,插入到body元素中。
> 这是插入body中的

> 这是不插入body中的(可以对比下)

2. 我们需要将其插入body元素中吗?如果是单个页面中只出现一个,那影响不大;如果是多个,我们要选中该元素时就很不方便了。
3. 且,我们这边使用的是自定义指令的方式,指令在el-select元素上,teleported为false,不插入body时,正好可以在自定义指令中使用el.querySelector('.el-scrollbar__wrap')获取滚动的元素。
5) 自定义指令
前端代码在这里:GitHub - wwaini/tao-vue3 at release240625
// src/directives/loadmore/index.js
import { debounce } from "lodash";export default {mounted(el, binding) {// 不插入body时,以下方式可获取元素// 插入body时,需要以document.querySelector('.el-scrollbar__wrap')获取let scrollWrap = el.querySelector('.el-scrollbar__wrap')// 把监听的方法防抖一下const handle = debounce((e) => {let scrollDistance = scrollWrap.scrollHeight - scrollWrap.scrollTop// 比如此处预留10个像素的位置用于触底if (scrollWrap.clientHeight + 10 > scrollDistance) {binding.value() // 触底通知一下,外界}}, 170)// 绑定监听滚动事件scrollWrap?.addEventListener('scroll', handle)// 方法挂载到元素身上便于解绑时使用el._hanlde = handle},unmounted(el, binding) {let scrollWrap = document.querySelector('.el-scrollbar__wrap')scrollWrap?.removeEventListener('scroll', el._hanlde)el._hanlde = null}
}
// directives/index.js
import loadmore from "./loadmore"
// 自定义指令对象,用于遍历注册
const directives = {loadmore
}
// 批量注册指令并暴露到main.js中去便于注册
export default {install(app) {Object.keys(directives).forEach((key) => {app.directive(key, directives[key])})}
}
// main.js
import { createApp } from 'vue';
import App from './App.vue';const app = createApp(App);// 引入并使用自定义指令
import directive from './directives'
app.use(directive);app.mount('#app');
// src/views/num/six.vue<!-- 下拉框触底加载自定义指令 --><template><div class="m-4"><p>第一个select</p><el-select v-model="value" v-loadmore="loadmore" :teleported="false" style="width:240px"><el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /></el-select><p>第二个select</p><el-select v-model="value" v-loadmore="loadmore" :teleported="false" style="width:240px"><el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /></el-select></div></template><script setup>
import axios from 'axios';
import { onMounted, reactive, ref } from 'vue'const list = ref([])
const options = ref([])
const option = ref([])
const value = ref([])
const loading = ref(false)
let pageData = reactive({pageIndex: 1,pageSize: 10
})
onMounted(() => {getOptions()
})
const getOptions = () => {axios.get(`http://localhost:9999/getSelectOptions?pageIndex=${pageData.pageIndex}&pageSize=${pageData.pageSize}`).then(res => {console.log(res.data);if (res.data.length < 1) {ElMessage({message: '没有更多数据了...',type: "warning",});}const newOptions = res.data.map((item) => {return { value: item.name, label: item.index }})options.value.push(...newOptions)})
}
// 触底了,继续发请求
const loadmore = () => {pageData.pageIndex = pageData.pageIndex + 1getOptions()
}</script>
如有不足,欢迎指正。
不要忽视你达成的每个小目标,它是你前进路上的垫脚石。冲!
相关文章:
ElementPlus 中el-select自定义指令实现触底加载请求options数据
1) 背景: 老项目翻新时,发现一个下拉框数据非常多,客户呢,希望全部数据一起展示,意思就是全部数据一起返回给前端用于展示。但这会造成明显的卡顿。~~明显的不合理! QAQ!~~ 于是压力给到前端,查询资料,各种…...
基于Selenium实现操作网页及操作windows桌面应用
Selenium操作Web页面 Why? 通常情况下,网络安全相关领域,更多是偏重于协议和通信。但是,如果协议通信过程被加密或者无法了解其协议构成,是无法直接通过协议进行处理。此时,可以考虑模拟UI操作,进而实现相…...
科普文:linux系列之操作系统内存管理简介
概叙 操作系统内存管理是计算机系统中的核心技术之一,页式管理、段式管理和段页式管理各有优缺点。页式管理通过固定大小的页框减少了外部碎片,但可能导致内部碎片;段式管理符合程序逻辑,提供了灵活的内存保护,但可能…...
【已解决】关于MyBatis的collection集合中只能取到一条数据的问题
一、问题 在涉及多表查询的时候,使用collection元素来映射集合属性时,出现了只能查询到一条数据的情况,但用sql语句在数据库中查询会有多条记录。 二、原因 如果两表联查,主表和明细表的主键都是id的话,明细表的多条…...
前端的学习-CSS(弹性布局-flex)
一:什么是弹性布局-Flex flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。 语法: .box{display: flex; } .box{display: inline-flex; } 注意,设为 Flex 布局以后࿰…...
vue3集成LuckySheet实现导入本地Excel进行在线编辑,以及导出功能
第一步:克隆或者下载下面的代码 git clone https://github.com/dream-num/Luckysheet.git第二步:安装依赖 npm install npm install gulp -g 第三步:运行 npm run dev效果如下图所示 第四步:打包 打包执行成功后,…...
【征求意见】同济大学--城镇给水厂碳排放核算与评价方法
城镇给水厂保障城镇居民正常生活,是社会经济良性发展的重要基础性设施,对于我国双碳战略目标的实现至关重要。 随着城镇化的发展,城镇供水量不断升高,加上 水资源与生态环境问题不断涌现,人们对水的安全和品质的需求日…...
【Python】后台开发返回方法和状态码类的实现
Python 后台开发中,获取返回的类方法,以及状态码类的实现 代码备份 Code - response.py """ Response class for quick generate response """ from loguru_logger import get_loggerlogger get_logger(__name__)clas…...
opencloudosV8.6和openEuler 24安装 k8s
在三台机器上部署 Kubernetes 集群 1.环境准备2.在所有节点上进行以下步骤1. 更新系统和安装必要的软件包2. 禁用交换分区3. 禁用防火墙和SElinux4.系统主机名5.设置主机名与IP地址解析6.配置内核转发及网桥过滤7. 配置 Docker Cgroup 驱动8. 添加 Kubernetes 仓库并安装 kubea…...
Tensor安装和测试
1: 打开git官方 https://github.com/NVIDIA/TensorRT 2: 下载得到:TensorRT-10.2.0.19.Linux.x86_64-gnu.cuda-11.8.tar.gz 3: 下载后配置环境变量,上面地址记得改成真实地址。 4: 如果想python使用tensorrt,那么 解压后目录,…...
ELK对业务日志进行收集
ELK对业务日志进行收集 下载httpd 进到文件设置收集httpd的文件进行 设置 编辑内容 用于收集日志的内容 将日志的内容发送到实例当中 input {file{path > /etc/httpd/logs/access_logtype > "access"start_position > "beginning"}file{path &g…...
新质生产力
新质生产力”是一个相对较新的概念,指的是在数字化、智能化背景下,依托新技术、新业态、新模式,提升生产力质量和效率的一种生产力形态。它强调的是技术和创新对生产力的提升作用,尤其是在人工智能、大数据、互联网等新兴技术的推…...
《LeetCode热题100》---<5.②普通数组篇五道>
本篇博客讲解LeetCode热题100道普通数组篇中的六道题 第三道:轮转数组(中等) 第四道:除自身以外数组的乘积(中等) 第三道:轮转数组(中等) 方法一:使用额外的数…...
【面试题】【C语言】寻找两个正序数组的中位数
寻找两个正序数组的中位数 仅供学习 题目 算法时间复杂度 二分查找算法,时间复杂度为 O(log(min(m, n))),其中 m 和 n 分别是两个数组的长度。 子函数 查找两个数字的最大值 int max(int a, int b) {return a > b ? a : b; }查找两个数字的最小…...
原始的原型链是怎样玩的
带着问题看代码: 1、原始的继承是怎样实现继承的? A类的prototype 属性 B类的实例 2、实现继承后,连B类的中实例的属性(放在了A类的prototype中)和原型链的上的东西都可以用 3、A.prototype.constructor实际上已经指向…...
RabbitMQ高级篇(如何保证消息的可靠性、如何确保业务的幂等性、延迟消息的概念、延迟消息的应用)
文章目录 1. 消息丢失的情况2. 生产者的可靠性2.1 生产者重连2.2 生产者确认2.3 生产者确认机制的代码实现2.4 如何看待和处理生产者的确认信息 3. 消息代理(RabbitMQ)的可靠性3.1 数据持久化3.2 LazyQueue( 3.12 版本后所有队列都是 Lazy Qu…...
正点原子imx6ull-mini-Linux驱动之platform设备驱动实验(14)
我们在前面几章编写的设备驱动都非常的简单,都是对IO进行最简单的读写操作像I2C、 SPI、LCD 等这些复杂外设的驱动就不能这么去写了,Linux 系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件思路,在这个思路下诞生…...
z3基础学习
z3基础学习 z3是一个微软出品的开源约束求解器,能够解决很多种情况下的给定部分约束条件寻求一组满足条件的解的问题。 安装:pip install z3-solver 1. 简单使用 from z3 import * x Int(x) #创建名为x的int类型变量 y Int(y) solve(x y10,2*x…...
开发助手专业版,有反编译等多种功能
软件介绍 开发助手能够用来快速调试应用以及查看手机软硬件相关信息,包括:快速打开或关闭开发者选项中的选项。 将原来几十秒的操作缩短为一次点击。包括显示布局边界,显示 GPU 过度绘制。显示布局更新。强制 GPU 渲染 显示 GPU 视图更新&a…...
嵌入式初学-C语言-十一
#接嵌入式初学-C语言-十,以及部分例题# 循环结构 break和continue break 功能: 1. 用在switch中,用来跳出switch的case语句;如果case没有break,可能会产生case穿透。 2. 用在循环中(while、do..while、for..&#…...
终极窗口调整神器:WindowResizer完整使用指南
终极窗口调整神器:WindowResizer完整使用指南 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些顽固的Windows窗口而烦恼吗?无论你是遇到老旧软件界…...
淘金币全自动脚本终极指南:3分钟搞定淘宝每日任务,解放双手的简单教程
淘金币全自动脚本终极指南:3分钟搞定淘宝每日任务,解放双手的简单教程 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mir…...
抖音下载器终极指南:从零开始掌握无水印批量下载技巧
抖音下载器终极指南:从零开始掌握无水印批量下载技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…...
HealthGPT入门教程:5分钟快速搭建你的个人健康助手
HealthGPT入门教程:5分钟快速搭建你的个人健康助手 【免费下载链接】HealthGPT Query your Apple Health data with natural language 💬 🩺 项目地址: https://gitcode.com/gh_mirrors/he/HealthGPT 想要用自然语言查询你的Apple健康…...
告别环境报错!保姆级教程:从JRE到STM32CubeMX 6.10.0的完整安装与配置
从零搭建STM32开发环境:CubeMX 6.10.0避坑全指南 刚拿到STM32开发板时的兴奋,往往在环境配置阶段就被各种报错消磨殆尽。作为过来人,我深刻理解那种看着红色错误提示却无从下手的挫败感。本文将带你用最稳妥的方式完成从Java环境到CubeMX的全…...
Java十道高频面试题(一)
Java基础与集合1. HashMap的底层数据结构是什么?(JDK 1.7 vs 1.8)考察点:数据结构演进、哈希冲突解决、扩容死循环问题。参考答案:HashMap在JDK 1.7和1.8中有着本质的区别,主要体现在底层结构和扩容机制上&…...
掌握Windows 11精简艺术:Tiny11Builder实战手册
掌握Windows 11精简艺术:Tiny11Builder实战手册 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否曾因Windows 11的臃肿而烦恼?老旧设…...
Stagewise:基于Chromium的AI编程浏览器,重塑前端开发工作流
1. 项目概述:一个为开发者而生的“浏览器AI助手”新物种 如果你和我一样,每天的工作流是在浏览器、代码编辑器和终端之间反复横跳,那么你肯定也幻想过:要是能有一个工具,把这三者无缝融合在一起就好了。最近࿰…...
解锁PS4游戏存档的终极掌控:Apollo Save Tool深度技术解析
解锁PS4游戏存档的终极掌控:Apollo Save Tool深度技术解析 【免费下载链接】apollo-ps4 Apollo Save Tool (PS4) 项目地址: https://gitcode.com/gh_mirrors/ap/apollo-ps4 在PlayStation 4的游戏生态中,PS4存档管理和游戏数据修改一直是玩家和开…...
从继电器到边缘计算:拆解PAC控制器里的‘智能手机’架构(以Codesys/倍福为例)
从继电器到边缘计算:拆解PAC控制器里的‘智能手机’架构 在工业自动化领域,PAC(可编程自动化控制器)正逐渐取代传统PLC,成为智能制造的核心大脑。这种转变类似于功能手机向智能手机的进化——从单一功能到开放平台&…...
