vue3+elPlus 选择框select 下拉数据过千条,页面卡顿,分页解决

vue3+elPlus 选择框select 下拉数据过千条,页面卡顿,分页解决
注意:我这里是提前将下拉数据请求到,保存到本地,来分页
也可分页请求接口来获取,性质一样

最重要的是,监听滑动到底部的vue指令

v-loadmore=“selectListPageHandle”

在文件中directive—loadmore—index.tx
自定义指令

import { Directive, DirectiveBinding } from 'vue'
/*** 操作权限处理*/
export const loadmore: Directive = {beforeMount(el: HTMLElement, binding: DirectiveBinding) {let classDirect = el.className.split(" ")[1]const selectDom = document.querySelector(`.event-select-poper${classDirect} .el-scrollbar__wrap`)let loadMores = function () {const isBase = this.scrollHeight - this.scrollTop <= this.clientHeight + 20if (isBase) {// 增加防抖binding.value && binding.value()}}// 将获取到的dom和函数挂载到el-select上,实例销毁时好处理el.selectDomInfo = selectDomel.selectLoadMore = loadMores// 监听滚动事件selectDom?.addEventListener('scroll', loadMores.bind(selectDom))},// 实例销毁beforeUnmount(el) {if (el.selectLoadMore) {el.selectDomInfo.removeEventListener('scroll', el.selectLoadMore)delete el.selectDomInfodelete el.selectLoadMore}}
}

导入全局Index.ts

import { loadmore } from './loadmore'
import { App } from 'vue';
export default (app: App) => {app.directive('loadmore', loadmore);};

// 自定义指令
main.ts中引入(百度怎么引入全局指令,这里不详细说了)

import directive from '@/directive';
// 自定义指令
directive(app)

直接贴代码

// 封装的组件
<template><el-combo-box:popper-class="'event-select-poper'+directCustom":class="directCustom"v-loadmore="selectListPageHandle"style="width: 100%"v-model="valueName"filterableremote:remote-method="remoteMethod":loading="loading":dropdown-visible-always="true":show-option-tooltip="true"@focus="focusChange"@change="selectChange"><el-optionv-for="dict in selectList":key="dict.code":label="dict.label":value="dict.code"></el-option></el-combo-box>
</template><script setup lang="ts">
import { ref, watch, computed } from 'vue'
const props = defineProps({modelValue: [String, Object, Array],selectAllList: {type: Array,default: []},disabled: {type: Boolean,default: false},directCustom: {type: String,default: ''}
})
const emit = defineEmits(['update:modelValue', 'changeCallback'])
watch(() => props.modelValue,async (val) => {if (val) {// 回显默认值valueName.value = val} else {valueName.value = []}}
)const selectList = ref<any>([])
const valueName = ref('')
const loading = ref(false)// 本地分页方法
let pageSize = 10
let pageNumber = 1
const resetselectListInit = () => {pageNumber = 1 // 重置页数selectList.value = [] // 重置选项selectListPageHandle()
}
const selectListPageHandle = ($event) => {if (loading.value) {return false}// 数据加载完之后,不需要再获取if (selectList.value.length >= props.selectAllList.length) {return false}loading.value = truelet resData = props.selectAllList.slice((pageNumber - 1) * pageSize, pageNumber * pageSize)selectList.value = selectList.value.concat(resData)pageNumber += 1//加载完成loading.value = false
}
// 本地过滤
const remoteMethod = (query: string) => {if (query) {// 手动触发下拉框回滚至顶部,避免触发v-selectLazyLoad指令// document.querySelector(`.el-select-dropdown__wrap`).scrollTop = 0;if (loading.value) {return false}loading.value = trueselectList.value = props.selectAllList.filter((item) => {return item.codeAndName.toLowerCase().includes(query.toLowerCase())})loading.value = false} else {// 为空时,显示第一页数据resetselectListInit()}
}
const focusChange = () => {// 重置(显示第一页数据)resetselectListInit()
}
const selectChange = (data) => {emit('update:modelValue', data)emit('changeCallback', data)
}
</script><style scoped lang="scss"></style>

引用组件
import elComboxNew from ‘@/components/elComboxNew/index.vue’

<el-row><el-col :span="12" class="left-form-gen"><el-form-item label="合同文本管理组织" prop="archivesDepartmentCode"><elComboxNewdirectCustom="archivesDepartmentCode"v-model="dataForm.archivesDepartmentCode":selectAllList="archivesDepartmentCodeList"></elComboxNew></el-form-item></el-col></el-row>
// 请求所有数据
onMounted(() => {getArchivesDepartmentCodeList()
})const archivesDepartmentCodeList = ref<any>([])
const getArchivesDepartmentCodeList = () => {return new Promise((resolve, reject) => {AJX_archivesDepartmentCodeList().then((res: any) => {let archivesDepartmentCodeListStore = res.data ?? []archivesDepartmentCodeList.value = archivesDepartmentCodeListStore.map((item) => {return {code: item.archivesDepartmentCode,label: item.archivesDepartmentCode + item.archivesDepartmentName}})resolve(true)})})
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/480716.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能的微积分基础

目录 ​编辑 引言 微积分的基本概念 1. 导数 2. 积分 3. 微分方程 微积分在人工智能中的应用 1. 机器学习中的优化 2. 反向传播算法 3. 概率与统计 4. 控制理论 5. 自然语言处理中的梯度 6. 计算机视觉中的积分 7. 优化算法中的微积分 8. 微分几何在深度学习中的…

canal同步数据教程

canal简介 官网&#xff1a;https://github.com/alibaba/canal 主要是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费&#xff0c;是一个实时同步的方案。 基于日志增量订阅和消费的业务包括 数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、…

《Learn Three.js》学习(3)光源

前言&#xff1a; WebGL本身不支持光源&#xff0c;不使用three.js,则需使用着色程序来模拟光源。 学习大纲&#xff1a; Three.js中的光源 特定光源的使用时机 如何调整和配置所有光源的行为 如何创建镜头光晕 光源表 基础光源&#xff1a;THRER.AmbientLight、THERE.Point…

shell(9)

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&…

【头歌实训:递归实现斐波那契数列】

头歌实训&#xff1a;递归实现斐波那契数列 文章目录 任务描述相关知识递归相关知识递归举例何时使用递归定义是递归的数据结构是递归的问题的求解方法是递归的 编程要求测试说明源代码&#xff1a; 任务描述 本关任务&#xff1a;递归求解斐波那契数列。 相关知识 为了完成…

回声消除延时估计的一些方法

在音频信号处理&#xff0c;尤其是在回声消除和语音通信中&#xff0c;延时估计是一个至关重要的任务。回声消除技术旨在减少或消除在语音通信中由于信号反射而产生的回声。为了有效地实现这一点&#xff0c;系统需要准确估计发送信号和接收信号之间的延迟。通过了解延迟&#…

我们来学mysql -- 事务之概念(原理篇)

事务的概念 题记一个例子一致性隔离性原子性持久性 题记 在漫长的编程岁月中&#xff0c;存在一如既往地贯穿着工作&#xff0c;面试的概念这类知识点&#xff0c;事不关己当然高高挂起&#xff0c;精准踩坑时那心情也的却是日了&#x1f436;请原谅我的粗俗&#xff0c;遇到B…

剪映自动批量替换视频、图片素材教程,视频批量复刻、混剪裂变等功能介绍

一、三种批量替换模式的区别 二、混剪裂变替换素材 三、分区混剪裂变替换素材 四、按组精确替换素材 五、绿色按钮教程 &#xff08;一&#xff09;如何附加音频和srt字幕 &#xff08;二&#xff09;如何替换固定文本的内容和样式 &#xff08;三&#xff09;如何附加…

【力扣】389.找不同

问题描述 思路解析 只有小写字母&#xff0c;这种设计参数小的&#xff0c;直接桶排序我最开始的想法是使用两个不同的数组&#xff0c;分别存入他们单个字符转换后的值&#xff0c;然后比较是否相同。也确实通过了 看了题解后&#xff0c;发现可以优化&#xff0c;首先因为t相…

HarmonyOS Next 模拟器安装与探索

HarmonyOS 5 也发布了有一段时间了&#xff0c;不知道大家实际使用的时候有没有发现一些惊喜。当然随着HarmonyOS 5的更新也带来了很多新特性&#xff0c;尤其是 HarmonyOS Next 模拟器。今天&#xff0c;我们就来探索一下这个模拟器&#xff0c;看看它能给我们的开发过程带来什…

net9 abp vnext 多语言通过数据库动态管理

通过数据库加载实现动态管理&#xff0c;用户可以自己修改界面显示的文本&#xff0c;满足国际化需求 如图所示,前端使用tdesign vnext 新建表TSYS_Localization与TSYS_LocalizationDetail 国旗图标下载网址flag-icons: Free Country Flags in SVG 在Shared下创建下图3个文件 …

ceph的用户管理和cephx认证

用户权限概述 用户格式 参考链接&#xff1a; 权限&#xff1a;https://docs.ceph.com/en/latest/rados/operations/user-management/#authorization-capabilities 用户&#xff1a;https://docs.ceph.com/en/reef/rados/operations/user-management/ ceph的用户格式TYPEID…

springboot340“共享书角”图书借还管理系统(论文+源码)_kaic

摘 要 随着社会的发展&#xff0c;图书借还的管理形势越来越严峻。越来越多的借阅者利用互联网获得信息&#xff0c;但图书借还信息量大。为了方便借阅者更好的获得本图书借还信息&#xff0c;因此&#xff0c;设计一种安全高效的“共享书角”图书借还管理系统极为重要。 为…

爬虫笔记24——纷玩岛自动抢票脚本笔记

纷玩岛自动抢票&#xff0c;协议抢票思路实现 一、获取Authorization凭证二、几个关键的参数三、几个关键的接口获取参数v&#xff0c;这个参数其实可以写死&#xff0c;可忽略通过价位获取演出的参数信息获取观演人信息&#xff0c;账号提前录入即可提交订单接口 先看实现图&a…

配置泛微e9后端开发环境

配置泛微e9的后端开发环境 1.安装jdk1.8&#xff08;请自行安装并设置环境变量&#xff09; 2.将服务器上的WEARVER文件夹拷贝到开发环境下(其中要包含ecology和Resin目录) 3.通过idea创建一个基础Java项目,将jdk设置为1.8 4.添加依赖,需要将3个文件夹的所有jar包添加到项目中…

52-基于单片机的超声波、温湿度、光照检测分阶段报警

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 1.通过DHT11模块读取环境温度和湿度: 2.将湿度、障碍物距显示在lcd1602上面&#xff0c;第一行显示温度和湿度,格式为:xxCyy%&#xff0c;第二行显示超声波传感器测得的距离&#xff0c;格式为:Di…

C++类的自动转换和强制类型转换

目录 一、类型转换 二、转换函数 一、类型转换 C⽀持内置类型隐式类型转换为类类型对象&#xff0c;需要有相关内置类型为参数的构造函数 简单说就是可以将内置类型转化为自定义类型 示例&#xff1a; class Test { public:Test(int n1 0):num1(n1){}void pr…

w~视觉~合集26

我自己的原文哦~ https://blog.51cto.com/whaosoft/12663170 #InternVL 本文设计了一个大规模的视觉-语言基础模型&#xff08;InternVL&#xff09;&#xff0c;将视觉基础模型的参数扩展到60亿&#xff0c;并逐步与LLM对齐&#xff0c;利用来自不同来源的网络规模的图像-文…

C++优选算法十六 BFS解决最短路问题

1.BFS解决最短路问题的优势与局限 BFS是一种有效的解决最短路问题的算法&#xff0c;特别适用于无权图或边权相等的图。 优势&#xff1a; BFS能够逐层遍历图中的所有节点&#xff0c;直到找到目标节点或遍历完所有可达节点。对于无权图&#xff08;即边权为1的图&#xff0…

服务器创建容器时报错: no main manifest attribute

1.出现问题的原因 springboot项目快速搭建完成以后&#xff0c;打包 > 制作容器 > 启动 在创建完成docker容器以后,启动时出现以下问题 查询了一下百度,说的是没有main文件信息, 2.解决方法 在pom文件里面加入以下代码即可 <plugins><plugin><groupI…