vue3 elementUI select 下拉加载更多

该文章展示了如何在Vue中创建一个名为`loadMore`的自定义指令,用于监听滚动事件并实现数据的分页加载。在`scrollSelect.vue`组件中,当滚动到底部时,`loadMore`函数会被调用,进行防抖处理,防止频繁请求。同时,文章还包含了组件的数据结构和事件处理。
摘要由CSDN通过智能技术生成
  • directive.ts

import { Directive, DirectiveBinding } from 'vue'

const loadMore: Directive = {
    beforeMount(el: any, binding: DirectiveBinding) {
        console.log(el)
        const selectDom = document.querySelector('.el-select-dropdown .el-select-dropdown__wrap')

        function loadMores(this: any) {
            const isBase = this.scrollHeight - this.scrollTop <= this.clientHeight
            if (isBase) {
                binding.value && binding.value()
            }
        }
        el.selectDomInfo = selectDom
        el.userLoadMore = loadMores

        selectDom?.addEventListener('scroll', loadMores)
    },
    beforeUnmount(el: any) {
        if (el.userLoadMore) {
            el.selectDomInfo.removeEventListener('scroll', el.userLoadMore)
            delete el.selectDomInfo
            delete el.userLoadMore
        }
    }
}
export default loadMore

  • main.ts

import { createApp } from 'vue'
import App from './App.vue'
import router from '/@/router'
import loadMore from './directive'

const app = createApp(App)
app.use(router).directive('loadMore', loadMore)

  • scrollSelect.vue

<template>
    <el-select
        v-model="selectedValue"
        v-loadMore="loadMore"
        remote
        filterable
        class="more-select"
        :popper-class="`more-select-dropdown ${loading && 'loading'}`"
        @change="selectChange"
    >
        <!-- 只有isShow定义了false,才进行隐藏,否则正常显示 -->
        <el-option
            v-for="(item, index) in list"
            v-show="item.isShow === false ? false : true"
            :key="item.value + `'${index}'`"
            :label="item.label"
            :value="item.value"
        />
    </el-select>
</template>

<script setup lang="ts">
interface UploadProps {
    dataList: any
    files: any
    width: number
    height: number
    disabled: boolean
    auto?: boolean
    bucket: string //上传到哪个Bucket
}
const props = withDefaults(defineProps<UploadProps>(), {
    dataList: [],
    files: '',
    width: 100,
    height: 100,
    disabled: false,
    auto: true,
    bucket: ''
})
const selectedValue = ref([])
const selectData = reactive({
    pageIndex: 1,
    pageSize: 5,
    finished: false
})

const loadMore = () => {
    // 防抖处理
    setTimeout(() => {
        if (selectData.finished) return
        selectData.pageIndex += 1
        list.value = list.value.concat(list.value)
    }, 500)
}

const loading = ref(false)
const list = ref([
    {
        isShow: true,
        value: 1,
        label: '测试1'
    },
    {
        isShow: true,
        value: 2,
        label: '测试2'
    },
    {
        isShow: true,
        value: 3,
        label: '测试3'
    },
    {
        isShow: true,
        value: 4,
        label: '测试4'
    },
    {
        isShow: true,
        value: 5,
        label: '测试5'
    },
    {
        isShow: true,
        value: 6,
        label: '测试6'
    },
    {
        isShow: true,
        value: 7,
        label: '测试7'
    },
    {
        isShow: true,
        value: 8,
        label: '测试8'
    },
    {
        isShow: true,
        value: 9,
        label: '测试9'
    },
    {
        isShow: true,
        value: 10,
        label: '测试10'
    }
])

const selectChange = () => {
    console.log(2)
}
</script>
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值