很多业务系统中都会用到表格/列表,大部分都是用组件,配合搜索接口可以实现,搜索按钮是发送请求获取数据来更新表格数据。

但不是所有的列表都会有对应的后端搜索接口,比如在对一个弹窗里面的列表进行选择,数据量不是特别大的情况下希望前端支持筛选,可以更加方便快捷的对数据进行操作,这时候就需要用到数据筛选。
这部分代码是大佬写的,我觉得封装的函数很好,所以在这里记录学习一下。(应该不会被本人看到吧)

// 搜索相关数据
export function useSearchData<T extends Record<string, string | undefined>>(
  defaultSearchParams: T,
) {
  // 搜索参数
  const searchParams = reactive({
    ...defaultSearchParams,
  });

  // 分页参数
  const page = reactive({
    pageNumber: 1,
    pageSize: 10,
  });

  // 返回的数据
  const allDataList = ref<any[]>([]);
  //通过筛选匹配实现搜索,使用计算属性实现双向数据和缓存
  const filteredList = computed(() => allDataList.value.filter((item) => {
    const filterKeys = Object.keys(defaultSearchParams);
    return filterKeys.every((filterKey) => !filterKey
      || !item[filterKey]
      || (item[filterKey].toLowerCase()?.includes(
        (searchParams[filterKey] || '').toLowerCase(),
      )));
  }));
  // 匹配上查询条件总条数
  const total = computed(() => filteredList.value.length);

  // 当前页面匹配上查询条件的数据
  const dataList = computed(() => {
    const start = (page.pageNumber - 1) * page.pageSize;
    const end = page.pageNumber * page.pageSize;
    return filteredList.value.slice(start, end);
  });

//实时监听筛选,数据一变化就回到第一页,重新渲染数据
  watch(searchParams, () => {
    page.pageNumber = 1;
  }, { deep: true });
  watch(allDataList, () => {
    page.pageNumber = 1;
  });

  const visible = ref(false);
  //支持可选择列表
  const selectedRowKeys: Ref<string[]> = ref([]);
  const loading = ref(false);

//把要用到的数据都反出去,方便外部与组件配合使用。
  return {
    loading,
    visible,
    searchParams,
    page,
    total,
    dataList,
    allDataList,
    selectedRowKeys,
    setAllDataList(list) {
      allDataList.value = list;
    },
  };
}

使用案例

const {
  // visible: showSelectTableDialog,
  searchParams,
  dataList,
  allDataList,
  selectedRowKeys,
  setAllDataList,
} = useFESearchData({
//传入固定参数默认值
  databaseName: undefined,
  tableName: '',
});
posted on 2023-11-03 16:58  CrashedCat  阅读(104)  评论(0编辑  收藏  举报