由于用 input 实现下拉分页不太理想,转换了一个角度,用 select 实现,以下是具体实现(script-setup TS)

script-setup

<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({ name: 'LabelSelectCpm' })
</script> <script setup lang="ts">
import { ref, reactive } from 'vue'
// const emit = defineEmits([]) // select 绑定的 v-model
const value = ref()
const searchKeyword = ref()
//dom 事件节点
const dom = ref()
const loading = ref(false)
// select-options 数据源
const options = ref([])
// 分页控制
const requsetObj = reactive({
page: 1,
size: 50,
}) /**
* 加载接口数据
* @return Promise
*/
const loadData = async () => {
return new Promise((res, rej) => {
setTimeout(() => {
res(
Array.from(
{ length: requsetObj.size * requsetObj.page },
(v, i) => ({ label: `label${i}`, value: `value${i}` })
)
)
}, 300)
})
} /**
* @param {string} query 输入的搜索关键词
* @param {function} fn 需要在接口数据返回后执行的回调
*/
const remoteMethod = (query: string, fn?: Function) => {
loading.value = true
if (query) {
/* 记录输入的关键词 */
searchKeyword.value = query
loadData().then((res: any) => {
console.log(res)
options.value = res
loading.value = false
fn && fn()
})
} else {
/* 初始化数据逻辑 */
loadData().then((res: any) => {
console.log(res)
options.value = res
loading.value = false
fn && fn()
})
}
} const selectChange = (val: any) => {
const selectVal = options.value.filter((e: any) => e.value == val)
console.log('当前选中', selectVal)
} /* 滚动监听函数 */
const scrollAddEventFn = (e) => {
const self = e.target as any
if (self.scrollHeight - self.scrollTop <= self.clientHeight) {
console.log('分页查询')
requsetObj.page++
remoteMethod(searchKeyword.value)
}
}
const visibleChange = (isShow: any) => {
if (isShow) {
// 下拉框显示时,渲染数据,初始化滚动监听
remoteMethod(searchKeyword.value, () => {
/* 在数据渲染完之后的回调 */
/* 初始化滚动监听 (由于 dom 渲染未完成,所以需要开启一个 timeout 在 1s 后实现监听) */
const parentDom = document.querySelectorAll(
'.el-select-dropdown__wrap.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default'
) as any
setTimeout(() => {
parentDom.forEach((e: any, idx: number) => {
if (
e.querySelector('.LabelSelectCpmBox') &&
e.querySelector('.LabelSelectCpmBox').children &&
e.querySelector('.LabelSelectCpmBox').children.length >
0
) {
dom.value = parentDom[idx]
dom.value.addEventListener(
'scroll',
scrollAddEventFn,
false
)
}
})
}, 1000)
})
} else {
// 移除滚动监听
dom.value?.removeEventListener('scroll', scrollAddEventFn, false)
options.value = []
}
}
</script>

template

<template>
<div class="LabelSelectCpm">
<el-select
v-model="value"
:multiple="false"
filterable
remote
reserve-keyword
placeholder="输入关键词搜索"
:remote-method="remoteMethod"
@change="selectChange"
@visible-change="visibleChange"
:loading="loading"
>
<div class="LabelSelectCpmBox">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</div>
</el-select>
</div>
</template>

css 没有额外的代码,所以就不贴了

Vue3 element-plus 下拉分页 select分页的更多相关文章

  1. easyui combogrid下拉表格的分页/按键/动态搜索

    作者:xfl4629712  <  easyui combogrid下拉表格的分页/按键/动态搜索  > 需求: 1.下拉框下拉时出现表格: 2.表格带分页功能: 3.可以使用向上键.向下 ...

  2. jQuery对下拉框Select操作总结

    jQuery对下拉框Select操作总结 转自网络,留做备用 jQuery获取Select元素,并选择的Text和Value: 1. $("#select_id").change( ...

  3. struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input

    原文地址:struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input jsp页面 1     function dosearch() {2         if ($(&q ...

  4. JQuery操作下拉框 select

    要实现这种效果: html代码 1<script src="js/jquery-1.7.2.min.js"></script> 2 <table> ...

  5. 下拉框select中option居中样式

    下拉框select中option居中样式 text-align:center;text-align-last:center;

  6. 下拉框 select

    1.select 用来做什么? select 用于实现下来下拉列表,其 html 结构是这样的: <select name="city" id="city" ...

  7. 下拉菜单select高度(兼容IE6/IE7/IE8/火狐等主流浏览器)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 【jQuery获取下拉框select、单选框radio、input普通框的值和checkbox选中的个数】

    radio单选框:name属性相同 <input type="radio" id="sp_type" name="p_type" va ...

  9. 第三方 XListview 上拉加载、下拉刷新、分页加载和Gson解析

    注意:此Demo用的是第三方的Xlistview.jar,需要复制me文件夹到项目中,两个XML布局文件和一张图片 把下面的复制到String中 <string name="xlist ...

  10. Selenium下拉菜单(Select)的操作-----Selenium快速入门(五)

    对于一般元素的操作,我们只要掌握本系列的第二,三章即可大致足够.对于下拉菜单(Select)的操作,Selenium有专门的类Select进行处理.文档地址为:http://seleniumhq.gi ...

随机推荐

  1. php上传文件时出现 caution: request is not finished yet

    其中的一个原因:是wamp64下的tmp文件夹中的临时文件太多,把这个文件夹的临时文件清理后就可以了.

  2. java map重写 转大写、转驼峰

    /** * @author admin * @Description * 转大写 */ public class HashMapUpper<V> extends HashMap<St ...

  3. nRF52832起来之后测试是上电还是休眠唤醒的方法

    void fu_state_machine_init(void) { /* NRF_POWER_RESETREAS_SREQ_MASK JLINK DOWNLOAD / POWER ON can ca ...

  4. JUC学习!

    JUC 1.what? JUC就是java.util.concurrent下面的类包,专门用于多线程的开发. 2.why? 解决多线程.高并发 3.how?  ||  || ﹀ point1:vola ...

  5. h5移动端开发经验积累篇

    h5键盘控制 const el = document.documentElement || document.body const originHeight = el.clientHeight win ...

  6. js/css实现图片轮播

    实现样式: tplb.css ul, li { padding: 0; margin: 0; list-style: none; } .adver { margin: 0 auto; width: 7 ...

  7. 基于Rocky Linux搭建Windows域控制器

    1.基于Rocky Linux搭建Windows域控制器 https://blog.csdn.net/Sakura0156/article/details/125822938?spm=1001.210 ...

  8. 集训第二周计划:把cf近期的div2除了最后一题给切完

    太菜了太菜了,弄个训练计划. 晚上没事干的时候我想把博客园皮肤改一下,搜着搜着不知道怎么回事点进去一些竞赛选手的博客,比如这个 https://www.cnblogs.com/soda-ma/p/13 ...

  9. 干货 | BitSail Connector 开发详解系列一:Source

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 BitSail 是字节跳动自研的数据集成产品,支持多种异构数据源间的数据同步,并提供离线.实时.全量.增量场景下全 ...

  10. [Python]语音识别媒体中的音频到文本

    @ 目录 准备工作 视频转音频 识别音频到文本 音频直接转换文本 准备工作 安装python3环境 申请一个可用的语音转换API,此篇以Microsoft Azure Speech为例 在Micros ...