赞
踩
做一个全局指令
查询了大量文章 发现统一用的指令 来实现触底加载功能 实操中发现 在vu3 的版本中
(我这个项目中)无法通过自定义指令的形参 获取el-select-dropdown .el-select-dropdown__wrap 元素
,所以通过el-select
中的popper-class
给下拉框加入一个类名
实现下拉框的选中,为了 方便指令通用
给el-select 加入自定义属性标签data-class 同popper-class值
,方便获取到当前标签的popper-class
在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; }); };
查询了很多文章 大部分都是直接通过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;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。