封装el-autocomplete下拉列表分页滚动加载

添加自定义指令函数在main.js抛出,方便系统其他地方可以直接调用

// 自定义指令,监听el-autocomplete下拉框的滚动,滚动到底部就加载下一页
  Vue.directive('scrollLoad', {
    bind(el, binding, vnode) {
      function handleScroll(e) {
        let isBottom = e.target.clientHeight + e.target.scrollTop >= e.target.scrollHeight - 40
        if (isBottom && !vnode.context.loading) {
          binding.value()
        }
      }
      // 监听滚动
      let wrapDom = el.querySelector('.el-autocomplete-suggestion__wrap')
      el.__handleScroll__ = handleScroll
      el.__wrapDom__ = wrapDom
      wrapDom.addEventListener('scroll', handleScroll, false)
    },

    unbind(el, binding, vnode) {
      // 解除事件监听
      el.__wrapDom__.removeEventListener('scroll', el.__handleScroll__, false)
    },
  })

在需要使用的地方直接使用v-scrollLoad="handleScroll"

// 调用地方
<el-autocomplete
  ref="refName"
  :fetch-suggestions="remoteMethod"
  @select="handleSelect"
  v-model="completeData"
  v-scrollLoad="handleScroll"
/>
// 方法定义
handleScroll(event) {
   // 添加加载loading,避免请求未完成时重复请求导致页码和数据错乱
   if(this.moreLoading) {
        return
   }
   this.moreLoading = true
   this.page += 1
   // getData自定义的请求数据的方法,在callback里处理下拉列表的数据
   this.getData(arr=>{
      this.$refs[refName].$data.suggestions.push(...arr)
      this.$nextTick(()=>{
        this.moreLoading = !arr.length
      })
   })
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 `el-table` 组件来展示 `el-autocomplete` 的下选项。具体做法如下: 1. 在 `el-autocomplete` 的 `popper-class` 属性中指定一个自定义的类名,例如 `autocomplete-table`: ```html <el-autocomplete popper-class="autocomplete-table"></el-autocomplete> ``` 2. 在 `autocomplete-table` 类名下定义一个 `el-table` 组件,并将 `el-autocomplete` 的下选项作为 `el-table` 的数据源: ```html <style> .autocomplete-table { width: 300px; } </style> <template> <el-autocomplete popper-class="autocomplete-table" :fetch-suggestions="querySearch"> <template slot-scope="{ item }"> <el-table :data="item.options"> <el-table-column prop="value" label="选项"></el-table-column> </el-table> </template> </el-autocomplete> </template> <script> export default { data() { return { options: [ { value: 'Option 1', options: [{ value: 'Option 1-1' }, { value: 'Option 1-2' }] }, { value: 'Option 2', options: [{ value: 'Option 2-1' }, { value: 'Option 2-2' }] }, { value: 'Option 3', options: [{ value: 'Option 3-1' }, { value: 'Option 3-2' }] } ] } }, methods: { querySearch(queryString, cb) { const results = this.options.filter(option => { return option.value.toLowerCase().indexOf(queryString.toLowerCase()) !== -1 }) cb(results) } } } </script> ``` 在上面的例子中,我们定义了一个 `options` 数组,数组中的每一个元素都是一个选项对象,包含一个 `value` 属性和一个 `options` 属性,`value` 属性表示选项的名称,`options` 属性是一个数组,表示该选项的下选项。在 `querySearch` 方法中,我们根据用户输入的 `queryString` 筛选出符合条件的选项,并将其作为 `el-autocomplete` 的下选项。在 `el-autocomplete` 中,我们使用 `slot-scope` 来获取每个选项的数据对象,然后使用 `el-table` 将该选项的下选项渲染为表格。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值