Element组件 el-select选择(设置滚动条+滚动加载更多)

发布于:2024-05-17 ⋅ 阅读:(387) ⋅ 点赞:(0)

系列文章目录


提示:下面是简单的功能实现(时间紧迫,大晚上赶工)


背景与展望

这次的功能甚至可以说一点也不复杂,但是作为一名前端开发.感觉这种交互行为其实出现在我们这个及其简易的功能场景中,就很离谱。需求做了又砍掉,纯纯的浪费时间,唉

本次的功能主要如下:

  1. 给el-select添加滚动条(设置样式)
  2. 给el-select的滚动条注册scroll事件(记得一定要移除scroll
  3. 体验感优化方法如下:
    添加节流或防抖功能
    添加loading交互
  4. 场景优化:
    不要污染全局的select框
    缓存选择的options(回显)
    采用footer插槽改变现有交互
    拓展远端搜索供能
    usehooks的提取(后面更新)
    自定义指令的的声明(后面更新)

一、使用原生的js实现触底加载

1.效果图如下:

请添加图片描述

2.HTML如下

// 此处使用的是高版本的 el-Select(具体的版本使用的方法都是类似的,下面会提到)
<body>
    <div id="app">
        <div style="margin: 50px 0px;"><el-text class="mx-1" type="primary">初始化的options数据条数如下:{{optionsLength}}</el-text></div>
        <el-select multiple   v-model="value" placeholder="Select" style="width: 160px;    height: 180px;" @visible-change="handleScroll">
            <el-option
                v-for="item in options"
                :key="item.value"
                :label="item.label"
                :value="item.value"
            >
            </el-option>
        </el-select>

    </div>
</body>

3.JS代码如下

//因为是使用的HTML文档 所以此处的代码风格是Vue2的
//(我上手还是蛮快的,哈哈哈哈哈哈,都3年多不写Vue2的代码了)
<script>
    const mockData1=[{label:"ceshi ",value:"sele1ct1"},{label:"ce2shi ",value:"sele12ct1"},{label:"cesh2i ",value:"sele3ct1"},{label:"ceshi3 ",value:"select1"},{label:"ceshi4 ",value:"sel1ec23t1"}]
    const { ElMessage } = ElementPlus;
    const App = {
        data() {
            return {
                message: "Hello Element Plus",
                options:[],
                value:"",
                mockOptions:[]
            };
        },
        computed:{
            optionsLength:function(){
                return this.options.length
            }
        },
        methods: {
            createNewOptionsData:function(){
                const str="测试dflklsadj我f的k京东数科了解阿ghjghjgj卡丽打飞gjghj机考拉激发lajfdkl"
                const randomNumber = Math.floor(Math.random()*(str.length-2))
                const result =str.split("")[randomNumber] + str.split("")[randomNumber+1]
                this.options.push({label:"随机生成:"+result,value:result})
            },
            scrollEvent(event){
                const domTarget =event.target
                const translateY = domTarget.scrollTop
                const viewheight =domTarget.clientHeight
                const allHeight = domTarget.scrollHeight
                if(allHeight-translateY<=viewheight){
                    this.createNewOptionsData()
                    // 添加一个数据
                    ElMessage({
                        message: `在Options中添加了一条数据,当前的条数为${this.options.length}`,
                        type: 'success',
                    })
 
                }
            }
            ,
            handleScroll:function(val){
            //这里注释的三个类,主要是抓的弹窗中的popover类,
            //一般情况下都可以使用,我这里使用的是 [el-scrollbar__wrap]
                // el-select-dropdown__wrap el-scrollbar__wrap el-scrollbar__wrap--hidden-default
                const dom = document.querySelector(".el-scrollbar__wrap")
                if(!val){
                    dom.removeEventListener("scroll",this.scrollEvent)
                }
               
                dom.addEventListener("scroll",this.scrollEvent)

            }
        },
        mounted() {
           	//此处都是为了mock数据
            this.options =mockData1
            this.createNewOptionsData()
        },
    };
    const app = Vue.createApp(App);
    app.mount("#app");
</script>



二、使用自定义指令解决问题(待补全)

敬请期待(2024-05-16 23:55)

总结

希望自己的写法可以帮助到遇到问题的人。有不足之处,或者可以优化的地方,欢迎大家给出自己的建议,会从大家的建议中汲取营养,提升自己!!!


网站公告

今日签到

点亮在社区的每一天
去签到