基于element-plus的选择组件el-select实现下拉加载封装

 在vue3项目当中使用element-plus的UI组件el-select选择器,有时候会用到选择器下拉下载的功能,封装一个指令可以进行这样操作。

在main.ts 当中封装v-loadmore指令:

app.directive('load-more', {
  updated(el, binding) {
    const trigger: HTMLElement = el.querySelector('.select-trigger')!;
    const id: string = trigger.getAttribute('aria-describedby')!;
    if (id) {
      const popper: HTMLElement = document.getElementById(id)!;
      const selectWrap: HTMLElement = popper.querySelector(
        '.el-scrollbar .el-select-dropdown__wrap'
      )!;
      /**
       * scrollHeight 获取元素内容高度(只读)
       * scrollTop 获取或者设置元素的偏移值,
       *  常用于:计算滚动条的位置, 当一个元素的容器没有产生垂直方向的滚动条, 那它的scrollTop的值默认为0.
       * clientHeight 读取元素的可见高度(只读)
       * 如果元素滚动到底, 下面等式返回true, 没有则返回false:
       * ele.scrollHeight - ele.scrollTop === ele.clientHeight;
       */
      // 提前1个元素加载数据
      selectWrap.addEventListener('scroll', () => {
        const { scrollHeight, scrollTop, clientHeight } = selectWrap;
        const conditon = scrollHeight - scrollTop - 34 < clientHeight;
        if (conditon) {
          binding.value();
        }
      });
    }
  }
});

在组件当中使用:

<el-select
      v-model="tokenSymbolVal"
      v-bind="$attrs"
      v-load-more="handleEcoScroll"
      class="w-full"
      clearable
      filterable
      remote
      collapse-tags-tooltip
      reserve-keyword
      :placeholder="$t('eth.selectToken')"
      remote-show-suffix
      :remote-method="handleRemoteMethod"
      :loading="initLoad"
      :no-data-text="$t('cross.birdge')"
      @visible-change="handleVisibleChange"
      @change="handleSelectChange"
      @clear="handleSelectClear"
    >
      <el-option
        v-for="item in tokenList.list"
        :key="item.ecosystem"
        :label="item.tokenSymbol"
        :value="String(item.ecosystem)"
      >
        <div class="flex justify-between items-center">
          <span>{{ item.tokenName }}</span>
          <div class="flex items-center">
            <span>
              {{ item.balance }}
            </span>
            <span class="ml-1">
              {{ item.tokenSymbol }}
            </span>
          </div>
        </div>
      </el-option>
    </el-select>

加载函数:

const handleEcoScroll = () => {
  if (scrollLoad.value) {
    return;
  }
  const totalHistory = tokenList.pageNum.total;
  console.log(totalHistory);
  const { page } = tokenList.pageNum;
  console.log('🚀 ~ file: CrossIn.vue:143 ~ handleEcoScroll ~ page:', page);
  const { limit } = objToken.value;
  const num = Math.ceil(totalHistory / limit);
  console.log(num);
  if (num > page) {
    objToken.value.page += 1;
    console.log(objToken.value.page);
    handleTokenList(chainName, objToken.value);
  }
};

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

任磊abc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值