一、选择器需要在关闭选择框的时候发请求
如果ap内容变了并且关闭了选择器,发请求;如果ap内容没变并且关闭了选择器,不发请求
思路:用一个变量记录,当select关闭时,变量不等于select绑定的值时,发请求,并更新变量
// 比较两个字符串数组中的元素是否相同
export function compareArrays(array1: string[], array2: string[]): boolean {
if (array1.length !== array2.length) {
return false; // 如果数组长度不同,则元素肯定不同
}
return array1.every((element, index) => element === array2[index]);
}
const handlePopupVisibleChange = (value: boolean) => {
if (value === false) {
if (compareArrays(filterForm.value.ap, previousContent.value) === false) {
handleSearch();
previousContent.value = filterForm.value.ap;
}
}
};
二、选择器需要加上全选;并且搜索后点击全选,选中的是搜索后的列表
思路:点击全选按钮,选中所有List;
搜索过滤后,再点击全选按钮,选中过滤后的List : 给select绑定search事件,获取搜索的数据,并标记搜索过的状态;点击全选,触发handleSelectAll,如果搜索过并且点击了全选,需要清空输入框的值,并且把option变成过滤后的数据;关闭选择器时,搜索过的状态需要置为False
<a-select
v-model="filterForm.ap"
v-model:input-value="inputValue"
:options="apList"
placeholder="请选择AP"
allow-search
allow-clear
:multiple="true"
style="width: 380px"
:max-tag-count="2"
@search="handleSearchAp"
@clear="handleApClear"
@popup-visible-change="handlePopupVisibleChange"
>
<template #empty>
<a-empty description="无搜索结果">
<template #image></template>
</a-empty>
</template>
<template #header>
<div style="padding: 6px 12px">
<a-checkbox v-model:model-value="isAllSelected" @change="handleSelectAll">
全选
</a-checkbox>
</div>
</template>
<template #prefix>AP</template>
</a-select>
/* 控制全选按钮的选中 */
watch(
() => filterForm.value.ap,
() => {
if (isFiltered.value) {
// 搜索之后,点击全选按钮,选中的是搜索后的列表
apList.value = filteredArray.value;
isAllSelected.value = filterForm.value.ap.length === filteredArray.value.length;
} else if (
filterForm.value.ap.length === props.apFilterList.length &&
filterForm.value.ap.length !== 0
) {
isAllSelected.value = true;
} else {
isAllSelected.value = false;
}
},
{
immediate: true,
},
);
/**
* 全选
*/
const handleSelectAll = (value: boolean) => {
if (isFiltered.value && value) {
// 搜索过并且点击了全选,需要清空输入框的值
filterForm.value.ap = filteredArray.value;
inputValue.value = '';
} else if (!isFiltered.value && value) {
filterForm.value.ap = props.apFilterList;
} else {
filterForm.value.ap = [];
}
};
/* 获取搜索的数据 */
const handleSearchAp = (value: any) => {
isFiltered.value = true;
filteredArray.value = apList.value.filter((item) => item.includes(value));
};
/* 关闭选择器时发请求 */
const handlePopupVisibleChange = (value: boolean) => {
if (value === false) {
// 需要判断是否有变化
if (compareArrays(filterForm.value.ap, previousContent.value) === false) {
handleSearch();
previousContent.value = filterForm.value.ap;
}
} else {
isFiltered.value = false;
apList.value = copyApList.value;
}
};
const handleApClear = () => {
filterForm.value.ap = [];
isAllSelected.value = false;
handleSearch();
};