vue3实现 下拉框触底加载更多及搜索
vue3实现 下拉框触底加载更多及搜索vue3实现 下拉框触底加载更多及搜索vue3实现 下拉框触底加载更多及搜索vue3实现 下拉框触底加载更多及搜索vue3实现 下拉框触底加载更多及搜索vue3实现 下拉框触底加载更多及搜索vue3实现 下拉框触底加载更多及搜索vue3实现 下拉框触底加载更多及搜索vue3实现 下拉框触底加载更多及搜索vue3实现 下拉框触底加载更多及搜索vue3实现 下拉框
·
思路
做一个全局指令
查询了大量文章 发现统一用的指令 来实现触底加载功能 实操中发现 在vu3 的版本中
(我这个项目中)无法通过自定义指令的形参 获取el-select-dropdown .el-select-dropdown__wrap 元素
,所以通过el-select
中的popper-class
给下拉框加入一个类名
实现下拉框的选中,为了 方便指令通用
给el-select 加入自定义属性标签data-class 同popper-class值
,方便获取到当前标签的popper-class
2、项目中的实际用法
在el-select 下再次封装
filtereMethod:自定义筛选的方法
popper-class:为当前select 下拉框的类名
data-class:同popper-class值
是为了解决指令el参数无法获取到.el-select-dropdown .el-select-dropdown__wrap元素
v-selectLoadMore: 自定义指令
<el-select
v-model="ruleForm.userId"
class="m-2"
data-class="selectClass"
placeholder="请选择"
filterable
:filter-method="filtereMethod"
v-selectLoadMore="getUserList"
popper-class="selectClass"
>
<el-option v-for="item in options" :key="item.userId" :label="item.nickname" :value="item.userId" />
</el-select>
const userParams = reactive({
bindSupplier: "2",
page: 0,
pageSize: 10,
nickname: ""
});
// 用于终止加载 后端数据返回的当前列表的总页数
let totalPage = 1;
const getUserList = async () => {
if (userParams.page < totalPage) {
let res: any = await getUserSupplierList(userParams as any);
if (userParams.page === 0) {
totalPage = res.data.totalPages;
}
options.value = options.value.concat(res.data.datas);
userParams.page++;
}
};
const filtereMethod = (val: any) => {
userParams.page = 0;
// 我这儿是根据名称筛选
userParams.nickname = val;
// 筛选时 下拉框回到顶部
nextTick(async () => {
// 注意: .selectClass 为当前所筛选的select 下拉框的 popper-class 属性值
let element = (document.querySelector(".selectClass") as any).querySelector(".el-select-dropdown .el-select-dropdown__wrap");
element.scrollTop = 0;
let res: any = await getUserSupplierList(userParams as any);
options.value = res.data.datas;
});
};
3、指令封装
查询了很多文章 大部分都是直接通过el.querySelector(".el-select-dropdown .el-select-dropdown__wrap")来查询当前元素 但是我通过实操发现无法获取 所以这里通过`自定义属性data-class来获取当前元素`
我这儿就不再写本项目注册全局指令的方法了 参考如下
/**
* v-selectLoadMore
* select 触底加载
*/
import type { Directive, DirectiveBinding } from "vue";
// 通过给标签加 data-class 来获取当前下拉框dom
const selectLoadMore: Directive = {
beforeMount(el: DirectiveBinding, binding: DirectiveBinding) {
const dataClass = "." + (el as any).getAttribute("select-class");
const dataClassElement = document.querySelector(dataClass) as any;
const element = dataClassElement.querySelector(".el-select-dropdown .el-select-dropdown__wrap");
element.addEventListener("scroll", () => {
const { scrollTop, scrollHeight, clientHeight } = element;
const scrollDistance = scrollHeight - scrollTop - clientHeight;
if (scrollDistance <= 0) {
binding.value();
}
});
}
};
export default selectLoadMore;
更多推荐
已为社区贡献10条内容
所有评论(0)