需求描述:在做搜索的时候由于有一个下拉列表接口返回数据特别多所以对列表进行了一个下拉触底加载的事件,但是官方文档是没有对应的api的所以自己使用指令写了一个方法。
实现代码:
javascript
<el-select
v-model="sellerNameSearchVal"
v-select-loadmore="loadmore"
remote
filterable
placeholder="请输入要搜索的供应商名称"
class="w100"
clearable
:remote-method="selectSearch"
@visible-change="selectVisibleChange"
@change="onSellerNameChange"
@clear="onSellerNameClear"
@keyup.native.enter="onSellerNameEnter"
>
<el-option
v-for="(item,index) in supplierList"
:key="index"
:label="item.label"
:value="item.value"
/>
<!-- 分页状态 -->
<el-option disabled style="height: 25px;" class="flex flex-center">
<div v-show="selectLoading">
<i class="el-icon-loading mr10" />
<span>正在加载更多...</span>
</div>
<div v-show="supplierList.length <= 0 && !selectLoading">无匹配数据</div>
<div v-if="supplierList.length > 0 && supplierLeave <= 0">没有更多了</div>
</el-option>
</el-select>
关键点在于v-select-loadmore="loadmore"这个自定义指令
javascript
directives: {
'select-loadmore': {
bind(el, binding) {
const element = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap')
element.addEventListener('scroll', function(e) {
// this.scrollTop 存在小数,导致加减存在1的误差
const condition = Math.abs(this.scrollHeight - this.scrollTop - this.clientHeight) <= 1
if (condition) binding?.value()
})
}
}
},
这个指令的逻辑是监听元素的滚动事件,当滚动高度达到select的高度后调用loadmore这个方法去加载下一页的数据