使用
<Select
ref="select"
v-model="storeId"
:label="'name'"
:options="storeList"
:loading="storeLoading"
:triggering="triggering"
:remoteTriggering="remoteTriggering"
:size="'small'"
:placeholder="'请选择/输入店铺名字进行查找'"
@visibleChange="visibleChange"
@loadMore="loadMore"
@remoteMethod="remoteMethod"
@change="storeChange"
/>
data:
/* 顶部店铺 start*/
triggering: true, //select是否允许加载更多
remoteTriggering: true, //select远程是否允许加载更多
storeId: '',
storeList: [],
storeLoading: false,
selectForm: {
pageNum: 1,
pageSize: 10,
name: ''
},
/* 顶部店铺 end*/
methods:
remoteMethod(query, page) {
this.selectForm.pageNum = page
this.selectForm.name = query
this.getStoreListData(true)
},
loadMore(page, isRemote) {
this.selectForm.pageNum = page
this.getStoreListData(isRemote)
},
visibleChange() {
// 发送请求的查找关键字
this.selectForm.name = ''
//远程开启可以下拉
this.remoteTriggering = true
},
接口:
getStoreListData: async function(isRemote) {
this.storeLoading = true;
try {
const res = await moveShopList({
pageNum: this.selectForm.pageNum,
pageSize: this.selectForm.pageSize,
name: this.selectForm.name
});
if (res.code === 200) {
const { list, total } = res.data;
this.storeList = list;
this.$nextTick(() => {
let optionsList = this.$refs.select.optionsList;
if (isRemote) {
if (optionsList && optionsList.length >= total) {
this.remoteTriggering = false;
} else {
this.remoteTriggering = true;
}
} else {
if (optionsList && optionsList.length >= total) {
this.triggering = false;
} else {
this.triggering = true;
}
}
});
this.storeLoading = false;
} else {
this.storeLoading = false;
this.$message.error(res.message);
}
} catch (error) {
this.storeLoading = false;
console.log(error);
}
},
组件:
<template>
<div>
<el-select
v-el-select-loadmore="loadMore"
:value="value"
:size="size"
:loading="loading"
:multiple="multiple"
:placeholder="placeholder"
:clearable="clearable"
filterable
remote
:remote-method="
(query) => {
remoteMethod(query, value);
}
"
style="width: 100%"
@change="change"
@input="$emit('input', $event)"
@visible-change="visibleChange"
>
<el-option v-if="hasAll" :label="defaultLabel" value="" />
<el-option
v-for="item in optionsList"
:key="item.id"
:label="item[label]"
:value="item.id"
/>
</el-select>
</div>
</template>
<script>
export default {
name: "Select",
directives: {
"el-select-loadmore": {
bind(el, binding) {
const DOM = el.querySelector(
".el-select-dropdown .el-select-dropdown__wrap"
);
DOM.addEventListener("scroll", function () {
const condition =
this.scrollHeight - this.scrollTop <= this.clientHeight;
if (condition) {
binding.value();
}
});
},
},
},
props: {
value: {
type: [String, Number, Array],
default: null,
},
label:{
require:true,
type:String,
default:""
},
options: {
type: Array,
default: () => {
return [];
},
},
triggering: {
type: Boolean,
default: true,
},
remoteTriggering: {
type: Boolean,
default: true,
},
size: {
type: String,
default: "medium",
},
clearable: {
type: Boolean,
default: false,
},
hasAll: {
type: Boolean,
default: false,
},
defaultLabel: {
type: String,
default: "全部",
},
loading: {
type: Boolean,
default: false,
},
placeholder: {
type: String,
default: "请选择",
},
multiple: {
type: Boolean,
default: false,
},
},
data() {
return {
page: 1,
pageRemote: 1,
timer: null,
optionsList: [],
oldOptions: [],
isRemote: false,
};
},
watch: {
options: {
handler(val) {
if (this.isRemote) {
if (val) {
if (this.pageRemote > 1) {
this.optionsList = [...this.optionsList, ...val];
} else {
this.optionsList = val;
}
console.log("this.oldOptions", this.oldOptions);
this.oldOptions = this.oldOptions.filter((item) => {
return !val.some((valItem) => item.id === valItem.id);
});
this.oldOptions = [...this.oldOptions, ...val];
}
} else {
if (val) {
this.optionsList = this.optionsList.filter((item) => {
return !val.some((valItem) => item.id === valItem.id);
});
this.optionsList = [...this.optionsList, ...val];
}
}
},
deep: true,
},
},
mounted() {
this.optionsList = this.options;
},
methods: {
change(val) {
this.$emit("change", val);
},
visibleChange(status) {
if (!status) {
if (this.isRemote) {
this.isRemote = false;
this.optionsList = [...this.oldOptions];
}
}
this.$emit("visibleChange", status);
},
loadMore() {
console.log(this.isRemote, this.triggering, this.remoteTriggering);
if (this.isRemote) {
if (this.remoteTriggering === false) return;
this.pageRemote++;
this.$emit("loadMore", this.pageRemote,true);
} else {
if (this.triggering === false) return;
console.log("this.page", this.page);
this.page++;
this.$emit("loadMore", this.page);
}
},
remoteMethod(query) {
console.log("remoteMethod");
this.pageRemote = 1;
if (this.timer) {
clearTimeout(this.timer);
this.timer = null;
}
this.timer = setTimeout(() => {
this.isRemote = true;
this.oldOptions = [...this.optionsList];
this.optionsList = [];
this.$emit("remoteMethod", query, this.pageRemote);
}, 500);
},
},
};
</script>
<style lang='scss' scoped>
</style>