写一个vue+element selected下拉框虚拟列表
时间: 2023-08-29 14:13:33 浏览: 282
这是一个基于Vue和Element组件库的虚拟列表下拉框实现。在这个下拉框中,当列表项数量非常多时,只会渲染可视区域的部分,从而提高性能。
```html
<template>
<el-select v-model="selected" placeholder="请选择" filterable remote :remote-method="loadOptions">
<template v-slot:default>
<el-option v-for="item in visibleOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
<el-option v-if="isLastPage" :key="'loading'" :label="'加载中...'" disabled></el-option>
</template>
</el-select>
</template>
<script>
export default {
data() {
return {
options: [], // 所有选项
visibleOptions: [], // 可见选项
selected: undefined, // 当前选中的值
pageSize: 10, // 每页显示的选项数量
currentPage: 1, // 当前页码
isLastPage: false // 是否已经加载完所有选项
};
},
methods: {
async loadOptions(query) {
// 模拟异步加载数据
await new Promise(resolve => setTimeout(resolve, 1000));
// 这里可以根据query参数从服务器获取数据
const data = Array.from({ length: 10000 }, (_, i) => ({ label: `选项${i + 1}`, value: i + 1 }));
// 如果没有更多数据了,则标记为最后一页
if (data.length < this.pageSize) {
this.isLastPage = true;
}
// 将新数据合并到原有数据中
this.options = this.options.concat(data);
// 更新可见选项
this.updateVisibleOptions(query);
},
updateVisibleOptions(query) {
const start = (this.currentPage - 1) * this.pageSize;
const end = start + this.pageSize;
this.visibleOptions = this.options.slice(start, end);
// 如果没有匹配的选项,则跳转到第一页
if (query && this.visibleOptions.every(item => !item.label.includes(query))) {
this.currentPage = 1;
this.updateVisibleOptions(query);
}
}
},
watch: {
currentPage() {
// 每次切换页码时更新可见选项
this.updateVisibleOptions();
}
}
};
</script>
```
在这个实现中,我们使用了`el-select`组件来实现下拉框,设置了`filterable`和`remote`属性来启用搜索和异步加载功能。每当用户输入查询关键字时,`loadOptions`方法就会被调用,该方法会模拟异步加载数据,并将新数据合并到`options`列表中。同时,根据当前页码和每页显示的选项数量,计算出可见选项的范围,并将其赋值给`visibleOptions`属性。如果没有匹配的选项,则跳转到第一页。如果已经加载完所有选项,则将`isLastPage`属性标记为`true`,以便在可见选项列表中显示“加载中...”的提示。用户每次滚动列表时,会触发`loadOptions`方法,从而实现虚拟滚动的效果。
阅读全文