由于用 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. Post 大小超出允许的限制

    原因大体找到了: 除了项目最外层有web.config, 在 Pages页面下还有一个web.config配置文件, 遍历顺序为 :aspx 页面同级目录-->逐级父级目录-->根目录-- ...

  2. 3.Vue常用特性

    1.表单操作 (1)基于Vue的表单操作 input 单行文本 处理方式就是使用 v-model双向绑定data中的数据 1 <input type="text" v-mod ...

  3. protobuf怎么处理java中的Object和Object[],protobuf的bytestring和object[]

    如题,作者一开始也遇到了这个比较棘手的问题. 话不多说,直接说解决方案. 这里使用bytestring,如果是object[]的话则用repeated定义即可. 那么问题又来了,用这个类型怎么做到与j ...

  4. 【帆吖】Java学习零基础21

    数组 1 package array; 2 3 public class Demo1 { 4 public static void main(String[] args) { 5 int[ ] num ...

  5. MySQL 索引的介绍

    参考:https://www.cnblogs.com/aspirant/p/9214485.html 参考:https://blog.codinglabs.org/articles/theory-of ...

  6. appium 怎么就一直连接不上设备呢

  7. R 字符串操作超全总结

    paste函数和paste0()函数 连接字符 > paste("a", 1:3) #默认空格符连接,即sep=" " [1] "a 1&quo ...

  8. BaseMapperX

    package cn.iocoder.yudao.framework.mybatis.core.mapper; import cn.iocoder.yudao.framework.common.poj ...

  9. File 未释放文件权柄问题处理

    Unreleased Resource: Files Abstract 程序可能无法释放某个文件句柄. Explanation 程序可能无法成功释放某一个文件句柄. 资源泄露至少有两种常见的原因: - ...

  10. 小心golang中的无类型常量

    对于无类型常量,可能大家是第一次听说,但这篇我就不放进拾遗系列里了. 因为虽然名字很陌生,但我们每天都在用,每天都有无数潜在的坑被埋下.包括我本人也犯过同样的错误,当时代码已经合并并发布了,当我意识到 ...