【elemenui】el-select下拉加载更多

【elemenui】el-select下拉加载更多

场景

当elemenui 的el-select的下拉框数据过多时,点击下拉框的时候,很明显能感觉到el-select非常卡顿,这时候可以通过下拉加载更多数据的思路来实现,也就是页面初始加载时,可以少给些数据,当用户滚动下拉框列表触底时,再加载更多的时候,就是分批往下拉框里面塞数据,这样就可以解决当数据量过多时,el-select卡顿的问题了

实现

主要是要要绑定ref 和 loading

  <el-select
            ref="geneSelect"
            :loading="loading"
            class="select-space"
            v-model="geneFeatures"
            placeholder="please select gene"
            @change="switchUmapGene(geneFeatures)"
          >

            <el-option
              v-for="(item) in sliceGeneOptions"
              :label="item['label']"
              :value="item['value']"
              :key="item['value']"
            >
    </el-option>

因为我的数据是本地存储,并没有接口请求,所以我用了2个变量
另外需要注意的是,无论你是从请求获取的数据还是本地数据,就是初始给到下拉框的数据,需要下拉框出现滚动条才可以

data(){
	return{
	   loading: false,
       noMore: false,
		geneOptions:[],//存储下拉框总的数据,这里本人就不提供示例数据了
		sliceGeneOptions:[
        {
          "label": "A1C",
          "value": "A1C"
        },
        {
          "label": "A2C",
          "value": "A2C"
        },
        {
          "label": "A3C",
          "value": "A3C"
        },
        {
          "label": "A4C",
          "value": "A4C"
        },
        {
          "label": "A5C",
          "value": "A5C"
        },
        {
          "label": "A6C",
          "value": "A6C"
        },
        {
          "label": "A7C",
          "value": "A7C"
        },
        {
          "label": "A8C",
          "value": "A8C"
        },
        {
          "label": "A9C",
          "value": "A9C"
        },
        {
          "label": "A10C",
          "value": "A10C"
        },
      ],//初始渲染下拉框,存储小的数据量的,
	}
}
methods:{
//加载更多数据的逻辑
 async loadMore(){
      if(this.loading) return
      this.loading = true
      let options = this.geneOptions.slice(this.sliceGeneOptions.length,this.sliceGeneOptions.length + 4)//从总的数据里面取出4条,也就是加载4条,想要滚动一次加载多少条数据,根据实际场景修改
      this.sliceGeneOptions = this.sliceGeneOptions.concat(options) //把新加载的数据和下拉框原本的数据做个合并
      this.timer = setTimeout(()=>{
        this.loading = false
      },500)

      if(this.geneOptions.length === this.sliceGeneOptions.length){ //当下拉框里面的数据长度等于总的数据时
        this.$refs.geneSelect.$refs.scrollbar.$refs.wrap.removeEventListener('scroll',this.scolling())
        this.noMore = true
      }
    },
    //判断是否el-select是否滚动到底部的逻辑
     scolling(){
      let e = this.$refs.geneSelect.$refs.scrollbar.$refs.wrap
      if(this.noMore) return
      // 到底时触发 loadMore
      let loadMore = e.scrollHeight -  e.scrollTop -5 < e.clientHeight

      if(loadMore){
        this.loadMore()
      }
    },
}mounted(){
//监听滚动
  this.$refs.geneSelect.$refs.scrollbar.$refs.wrap.addEventListener('scroll',this.scolling)
}

实际运用中如果有问题,欢迎大家评论区评论交流,希望对大家有帮助

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值