当前位置:实例文章 » HTML/CSS实例» [文章]vue2实现虚拟滚动select下拉组件-上万条数据下拉支持过滤(样式仿el-select)

vue2实现虚拟滚动select下拉组件-上万条数据下拉支持过滤(样式仿el-select)

发布人:shili8 发布时间:2025-01-05 01:16 阅读次数:0

**Vue2 实现虚拟滚动Select下拉组件**

在实际项目中,经常会遇到需要渲染大量数据的场景,如下拉列表、表格等。在这些情况下,如果直接使用原生DOM进行渲染,可能会导致性能问题和页面卡顿。因此,我们可以使用虚拟滚动技术来优化性能。

在本文中,我们将实现一个支持过滤的虚拟滚动Select下拉组件,样式仿el-select。

**组件结构**

首先,我们需要定义组件的结构:

html<template>
 <div class="virtual-scroll-select">
 <!-- 滚动容器 -->
 <div ref="scrollContainer" class="scroll-container">
 <!-- 项列表 -->
 <ul v-if="list.length >0" class="item-list">
 <li v-for="(item, index) in list" :key="index" @click="handleItemClick(item)">
 {{ item.label }}
 </li>
 </ul>
 </div>
 <!-- 输入框 -->
 <input ref="input"
 type="text"
 v-model="filterValue"
 placeholder="请输入内容..."
 @input="handleInput"
 @focus="handleFocus"
 @blur="handleBlur"
 />
 </div>
</template>


**组件逻辑**

接下来,我们需要实现组件的逻辑:

javascriptexport default {
 name: 'VirtualScrollSelect',
 data() {
 return {
 list: [], // 项列表 filterValue: '', // 过滤值 scrollContainerHeight:0, // 滚动容器高度 itemSize:40, // 项大小 startIndex:0, // 开始索引 endIndex:10, // 结束索引 }
 },
 mounted() {
 this.initList();
 },
 methods: {
 initList() {
 // 初始化项列表 this.list = [...Array(10000)].map((_, index) => ({
 label: `项 ${index +1}`,
 }));
 },
 handleInput(event) {
 // 过滤值改变时更新列表 const filterValue = event.target.value;
 this.filterValue = filterValue;
 this.updateList(filterValue);
 },
 updateList(filterValue) {
 // 更新列表 const list = this.list.filter((item) => item.label.includes(filterValue));
 this.list = list;
 this.updateScrollContainerHeight();
 },
 handleFocus() {
 // 焦点时更新滚动容器高度 this.updateScrollContainerHeight();
 },
 updateScrollContainerHeight() {
 // 更新滚动容器高度 const scrollContainer = this.$refs.scrollContainer;
 const itemSize = this.itemSize;
 const startIndex = this.startIndex;
 const endIndex = this.endIndex;
 const height = (endIndex - startIndex) * itemSize +10; // 加上边框和内边距 scrollContainer.style.height = `${height}px`;
 },
 handleItemClick(item) {
 // 项点击时更新列表 this.list = [...Array(10000)].map((_, index) => ({
 label: `项 ${index +1}`,
 }));
 this.updateList('');
 },
 }
}


**样式**

最后,我们需要定义组件的样式:

css.virtual-scroll-select {
 position: relative;
}

.scroll-container {
 overflow-y: auto;
 padding:10px;
 border:1px solid #ddd;
 box-shadow:02px4px rgba(0,0,0,0.1);
}

.item-list {
 list-style: none;
 margin:0;
 padding:0;
}

.item-list li {
 padding:10px;
 border-bottom:1px solid #ddd;
 cursor: pointer;
}

.item-list li:hover {
 background-color: #f5f5f5;
}


**总结**

在本文中,我们实现了一个支持过滤的虚拟滚动Select下拉组件,样式仿el-select。通过使用虚拟滚动技术和过滤功能,可以优化性能并提高用户体验。

当然,这只是一个基本示例,你可以根据实际需求进行扩展和修改。

其他信息

其他资源

Top