由于select组件如果里面的选择项过多,会造成卡顿,所以封装一个组件,节流选择,支持大数据搜索
<throttling-select v-model="value" :list="options" :placeholder="placeholder" selkey="key" sellabel="label"></throttling-select>
添加组件 throttling-select如下
<template>
<el-select
@visible-change="popChange"
v-model="selectValue"
filterable
remote
:placeholder="placeholder"
:remote-method="remoteMethod"
:loading="loading"
style="width: calc(98% - 20px)"
>
<el-option
v-for="item in options"
:key="item[selkey]"
:label="item[sellabel]"
:value="item[selkey]"
>
</el-option>
</el-select>
</template>
<script>
export default {
mixins: [],
filters: {},
components: {},
model: {
prop: 'value', //绑定的值,通过父组件传递
event: 'update' //自定义名
},
props: {
value: {
type: [String, Number],
default: ''
},
list: {//选项值
type: Array,
default: () => []
},
placeholder: {
type: [String, Number],
default: '选项多的属性,加载慢,建议搜索'
},
selkey: {
type: [String, Number],
default: 'key'
},
sellabel: {
type: [String, Number],
default: 'label'
}
},
data() {
return {
options: [],
selectValue: '',
loading: false
}
},
computed: {},
watch: {
selectValue(val) {
console.log(val)
this.$emit('update', val)
}
},
created() {
this.selectValue = this.value
},
mounted() {
},
destroyed() {
},
methods: {
popChange(e) {
console.log(e)
if (e) {
this.loading = true
this.options = this.list.length > 1000 ? [] : [...this.list]
this.loading = false
}
},
remoteMethod(query) {
console.log(query)
if (query !== '') {
this.loading = true
this.options = []
const reg = new RegExp(query.toLowerCase())
setTimeout(() => {
this.options = this.list.filter(item => {
return reg.test(item[this.selkey].toLowerCase())
})
this.loading = false
}, 50)
} else {
this.options = []
}
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped></style>