el-cascader饿了么级联选择器,滚动加载更多数据

本文介绍了如何在Vue中使用自定义指令`cascaderScroll`配合懒加载策略,实现在el-cascader组件下拉菜单的滚动加载更多数据功能,包括指令定义、懒加载逻辑和时机控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

根据业务需求,需要在左侧红框内实现向下滚动增加更多数据功能
方法:通过指令形式实现
1、定义指令:可以在组件内定义cascaderScroll,也可以全局定义指令

directives: {
    "cascaderScroll": function (el, binding) {
        const cascaderDom = el.querySelector(
              ".el-cascader__dropdown .el-cascader-menu__wrap"// 滚动条所在元素
          );
          if (cascaderDom) {
              cascaderDom.addEventListener("scroll", function () {
                  const condition =
                      this.scrollHeight - this.scrollTop <= this.clientHeight;
                  if (condition) {
                      let temp = this.scrollTop;
                      binding.value();
                      setTimeout(() => {
                          this.scrollTop = temp + 100;// 滚动加载更多时,显示的数据在上次位置基础上往上滑动100
                      }, 0)
                  }
              });
          }
    },
  },

2、使用指令:loadmore方法即为加载更多的逻辑

<el-cascader ref="refCascader" :props="treedata"  v-cascaderScroll="loadmore"></el-cascader>

3、我用的懒加载,需求是只有第一级分页滚动

data() {
    return {
      pageNo: 1,
      node: null, //懒加载缓存了一下node,用于在loadmore使用
      resolve:null //懒加载缓存了一下resolve,用于在loadmore使用
     }
  },
methods:{
	async loadmore() {
      console.log('下拉加载')
      this.pageNo++
      this.treedata.lazyLoad(this.node,this.resolve)
    },
	init() {
      let self = this;
        self.treedata = {
          lazy: true,
          async lazyLoad(node, resolve) {
            const { level, data } = node;
              if (level === 0) {
                self.node = node;
                self.resolve = resolve
              const data = await getFatherUnit({ unitName: '',pageNo:self.pageNo,pageSize:10 })
                data.data[0].records.forEach(e => {
                    e.value = e.unitId,
                    e.label = e.unitName,
                    e.leaf = e.unitIsChild === 1 // 1叶子节点 0非叶子节点
                })
                resolve(data.data[0].records)
            } else {
                const data = await getUnitByParentId({ unitId: node.value })
                data.data.forEach(e => {
                    e.value = e.unitId,
                    e.label = e.unitName,
                    e.leaf = e.unitIsChild === 1 // 1叶子节点 0非叶子节点
                });
                resolve(data.data)
            }
          }
      	}
    }
}

注意:定义指令时,要加上如下代码,否则数据渲染后会滑倒最上面一条显示

setTimeout(() => {
    this.scrollTop = temp + 100;// 滚动加载更多时,显示的数据在上次位置基础上往上滑动100
}, 0)

3、因为我用的懒加载,所以初始的时候要调用一下

mounted() {
    this.init()
  }

4、注:如果有多个级联框,当打开第二个级联框时,在合适的时机将分页需要初始到第一页。比如:visible-change下拉框出现/隐藏时触发

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值