select关闭时触发请求;select加上全选功能,并实现搜索后点击全选,选中的是搜索后的列表

16 篇文章 0 订阅
13 篇文章 0 订阅

一、选择器需要在关闭选择框的时候发请求

如果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();
  };
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值