Home
avatar

.Demure

表格分页、筛选、查询

表格分页查询,当前默认 size 为 10。提供通用入参:分页、搜索、筛选

前置引入——el-pagination

<el-pagination
    background
    v-model:current-page="pageData.current"   //和tableOperation文件联动,通用pageData
    v-model:page-size="pageData.size"
    :page-sizes="pageData.pageSizeOptions"
    layout="total, sizes, prev, pager, next, jumper"
    :total="pageData.total"
    @size-change="handleSizeChange"
    @current-change="handleCurrentChange"
/>

useTableOperations.ts

import { ref, reactive } from "vue";
import { useScrollRefresh } from "./useScrollRefresh";

/**
 * 表格操作通用 Composable
 * 包含搜索、分页、下拉筛选等通用逻辑
 */
export function useTableOperations() {
  // 搜索相关
  const search = ref("");

  // 下拉框筛选相关
  const dropdown = ref("");

  // 表格状态
  const tableLoading = ref(false);
  const tableData = ref<any[]>([]);

  // 分页数据
  const pageData = reactive({
    current: 1,
    size: 10,
    total: 0,
    pageSizeOptions: [10, 30, 50],
  });

  /**
   * 处理搜索
   * @param getTableDataFn 获取表格数据的函数
   */
  const handleSearch = (getTableDataFn: () => void, tableRef?: any) => {
    pageData.current = 1;
    getTableDataFn();
  };

  /**
   * 处理筛选变化
   * @param getTableDataFn 获取表格数据的函数
   */
  const handleFilterChange = (getTableDataFn: () => void, tableRef?: any) => {
    pageData.current = 1;
    getTableDataFn();
  };

  /**
   * 处理每页条数变化
   * @param val 每页条数
   * @param getTableDataFn 获取表格数据的函数
   */
  const handleSizeChange = (
    val: number,
    getTableDataFn: () => void,
    tableRef?: any
  ) => {
    pageData.current = 1;
    pageData.size = val;
    getTableDataFn();
  };

  /**
   * 处理当前页变化
   * @param val 当前页码
   * @param getTableDataFn 获取表格数据的函数
   */
  const handleCurrentChange = (
    val: number,
    getTableDataFn: () => void,
    tableRef?: any
  ) => {
    pageData.current = val;
    getTableDataFn();
  };

  /**
   * 重置搜索和筛选条件
   */
  const resetFilters = () => {
    search.value = "";
    dropdown.value = "";
    pageData.current = 1;
  };

  /**
   * 获取通用查询参数
   */
  const getQueryParams = (additionalParams: Record<string, any> = {}) => {
    return {
      current: pageData.current,
      size: pageData.size,
      search: search.value,
      dropdown: dropdown.value,
      ...additionalParams,
    };
  };

  return {
    // 响应式数据
    search,
    dropdown,
    tableLoading,
    tableData,
    pageData,
    // 方法
    handleSearch,
    handleFilterChange,
    handleSizeChange,
    handleCurrentChange,
    resetFilters,
    getQueryParams,
  };
}
Code

喜欢这篇文章嘛,觉得文章不错的话,奖励奖励我!

支付宝打赏支付宝微信打赏 微信