下拉框滚动条触底加载

记录:element中el-select下拉框滚动条触底加载方法。(获取唯一的下拉框的dom元素,这里用的是popper-class属性)

方法一:自定义指令方法实现(Vue3)

<script setup lang='ts'>
import { ref } from 'vue'
const selectmodel = ref()
const selectoptions = ref([
  {
    label: '1',
    value: '1'
  },
  {
    label: '2',
    value: '2'
  },
  {
    label: '3',
    value: '3'
  },
  {
    label: '4',
    value: '4'
  },
  {
    label: '5',
    value: '5'
  },
  {
    label: '6',
    value: '6'
  },
  {
    label: '7',
    value: '7'
  },
  {
    label: '8',
    value: '8'
  }
])
// 加载更多
const loadingmore = ref(false)
// 无数据
const loadingnomore = ref(false)
// 自定义指令-下拉框触底加载
const vLoadMore = {
  mounted(el: any, binding: any) {
    let dom:any = document.querySelector(
      ".myselect .el-select-dropdown__wrap.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default"
    );
    // 监听下拉框滚动事件
    dom.addEventListener("scroll", (e: any) => {
      if (e.target.scrollTop + e.target.clientHeight >= e.target.scrollHeight - 1) {
        // 调用绑定的方法
        loadingmore.value = true
        loadingnomore.value = false
        binding.value();
      } else {
        loadingmore.value = false
        loadingnomore.value = true


      }
    });
  },
};
// 滚动加载时触发的事件
const selectmore = () => {
  if (selectoptions.value.length <= 20) {
    selectoptions.value.push({
      label: String(selectoptions.value.length),
      value: String(selectoptions.value.length),
    })
  } else {
    loadingmore.value = false
    loadingnomore.value = true
  }

}

let timer: any = null
const throttle = (delay = 1000) => {
  if (timer == null) {
    timer = setTimeout(() => {
      // 滚动加载时触发的事件
      selectmore()
      clearTimeout(timer)
      timer = null
    }, 1000)
  }
}
</script>

<template>
  <el-select v-loadMore="throttle" popper-class="myselect" v-model="selectmodel" placeholder="Select" ref="selectRef">
    <el-option v-for="item in selectoptions" :key="item.value" :label="item.label" :value="item.value" />
    <p v-if="loadingmore">加载中</p>
    <p v-if="loadingnomore">无数据</p>
  </el-select>
 
</template>

<style lang='scss' scoped></style>

方法二:利用下拉框自带的visible-change(下拉框出现和隐藏事件)

<script setup lang='ts'>
import { ref } from 'vue'
const selectmodel = ref()
const selectoptions = ref([
  {
    label: '1',
    value: '1'
  },
  {
    label: '2',
    value: '2'
  },
  {
    label: '3',
    value: '3'
  },
  {
    label: '4',
    value: '4'
  },
  {
    label: '5',
    value: '5'
  },
  {
    label: '6',
    value: '6'
  },
  {
    label: '7',
    value: '7'
  },
  {
    label: '8',
    value: '8'
  }
])

const handleVisibleChange = (visible: any) => {
  if (visible) {
    // 如果下拉框显示
    let selectDropdown: any = document.querySelector('.el-select-dropdown__wrap')
    // 监听下拉框滚动事件
    selectDropdown.addEventListener('scroll', loadNextPage)
  } else {
    // 如果下拉框隐藏
    let selectDropdown: any = document.querySelector('.el-select-dropdown__wrap')
    // 移除下拉框滚动事件监听
    selectDropdown.removeEventListener('scroll', loadNextPage)
  }
}
const loadingmore = ref(false)
const loadingnomore = ref(false)
const loadNextPage = () => {
  let selectDropdown: any = document.querySelector('.el-select-dropdown__wrap');
  // 判断下拉框是否触底
  if (selectDropdown.scrollTop + selectDropdown.clientHeight >= selectDropdown.scrollHeight - 2) {
    loadingnomore.value = false
    loadingmore.value = true
    if (selectoptions.value.length <= 20) {
      setTimeout(() => {
        selectoptions.value.push({
          label: String(selectoptions.value.length),
          value: String(selectoptions.value.length),
        }
        )
        loadingmore.value = false

      }, 2000)
    }else{
      loadingmore.value = false
    selectDropdown.removeEventListener('scroll', loadNextPage)
    loadingnomore.value = true
    }
  } else {
    loadingnomore.value = true
  }
}

</script>
<!--  -->
<template>
  <div>
    <el-select class="slese" id="123"  @visible-change="handleVisibleChange" v-model="selectmodel" placeholder="Select"
      ref="selectRef">
      <el-option v-for="item in selectoptions" :key="item.value" :label="item.label" :value="item.value" />
      <p v-if="loadingmore">加载中</p>
      <p v-if="loadingnomore">无数据</p>
    </el-select>
  </div>
</template>

<style lang='scss' scoped></style>
  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
element是一种流行的前端UI库,提供了丰富的组件和工具,其中包括下拉框select)组件。当下拉框中的选项过多时,我们希望能够实现下拉框数据的触底加载,即当用户滚动到下拉框的底部时,自动加载更多的选项。 要实现下拉框数据触底加载,我们可以结合element提供的功能来完成。首先,我们可以利用下拉框组件的滚动事件(@scroll)来监听用户滚动操作。通过判断下拉框的滚动位置(scrollTop和scrollHeight),我们可以确定用户是否已滚动到底部。 当用户滚动到下拉框的底部时,我们可以调用一个加载函数,从后端获取更多的选项数据。我们可以通过element提供的API,如下拉框的remote方法或自定义的远程加载函数来实现。 在加载函数中,我们可以向后端发送异步请求,获取更多的选项数据。一般来说,我们可以通过分页的方式来加载数据,每次请求一定数量的选项。当然,也可以根据实际情况设计其他的加载方式。 最后,我们将获取到的选项数据添加到下拉框的选项列表中,让用户可以看到新加载的选项。这里可以使用element的选项数据(options)属性,动态更新下拉框的选项列表。 综上所述,我们可以通过监听下拉框的滚动事件,判断用户是否已滚动到底部并触发加载函数,从后端获取更多的选项数据,并将其添加到下拉框的选项列表中。这样就实现了下拉框数据的触底加载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值