当前位置:首页 > React

react如何封装usetable

2026-03-31 02:38:48React

封装 useTable 的自定义 Hook

封装 useTable 可以简化表格组件的逻辑,集中管理分页、排序、筛选等状态。以下是一个基于 react-table 或类似库的封装示例:

import { useMemo } from 'react';
import { useTable, useSortBy, usePagination } from 'react-table';

const useCustomTable = ({ columns, data, initialState = {} }) => {
  const {
    getTableProps,
    getTableBodyProps,
    headerGroups,
    prepareRow,
    page,
    canPreviousPage,
    canNextPage,
    pageOptions,
    pageCount,
    gotoPage,
    nextPage,
    previousPage,
    setPageSize,
    state: { pageIndex, pageSize, sortBy }
  } = useTable(
    {
      columns,
      data,
      initialState: {
        pageIndex: 0,
        pageSize: 10,
        ...initialState
      }
    },
    useSortBy,
    usePagination
  );

  return {
    getTableProps,
    getTableBodyProps,
    headerGroups,
    prepareRow,
    page,
    canPreviousPage,
    canNextPage,
    pageOptions,
    pageCount,
    gotoPage,
    nextPage,
    previousPage,
    setPageSize,
    pageIndex,
    pageSize,
    sortBy
  };
};

使用封装后的 Hook

在组件中直接调用封装好的 Hook,传入必要的参数即可:

import useCustomTable from './useCustomTable';

const TableComponent = ({ data }) => {
  const columns = useMemo(
    () => [
      { Header: 'ID', accessor: 'id' },
      { Header: 'Name', accessor: 'name' }
    ],
    []
  );

  const tableInstance = useCustomTable({ columns, data });

  return (
    <table {...tableInstance.getTableProps()}>
      <thead>
        {tableInstance.headerGroups.map(headerGroup => (
          <tr {...headerGroup.getHeaderGroupProps()}>
            {headerGroup.headers.map(column => (
              <th {...column.getHeaderProps(column.getSortByToggleProps())}>
                {column.render('Header')}
              </th>
            ))}
          </tr>
        ))}
      </thead>
      <tbody {...tableInstance.getTableBodyProps()}>
        {tableInstance.page.map(row => {
          tableInstance.prepareRow(row);
          return (
            <tr {...row.getRowProps()}>
              {row.cells.map(cell => (
                <td {...cell.getCellProps()}>{cell.render('Cell')}</td>
              ))}
            </tr>
          );
        })}
      </tbody>
    </table>
  );
};

扩展功能

如果需要支持更多功能(如筛选、行选择等),可以通过添加插件的方式扩展:

import { useTable, useSortBy, usePagination, useFilters, useRowSelect } from 'react-table';

const useEnhancedTable = ({ columns, data }) => {
  const instance = useTable(
    {
      columns,
      data
    },
    useFilters,
    useSortBy,
    usePagination,
    useRowSelect
  );

  return instance;
};

类型支持(TypeScript)

对于 TypeScript 项目,可以添加类型定义以提高代码健壮性:

react如何封装usetable

import { Column, useTable, TableInstance, UseSortByInstanceProps } from 'react-table';

interface CustomTableOptions<D extends object> {
  columns: Column<D>[];
  data: D[];
  initialState?: Partial<TableState<D>>;
}

const useCustomTable = <D extends object>({
  columns,
  data,
  initialState
}: CustomTableOptions<D>): TableInstance<D> & UseSortByInstanceProps<D> => {
  return useTable(
    { columns, data, initialState },
    useSortBy,
    usePagination
  );
};

标签: reactusetable
分享给朋友:

相关文章

react 如何引入jquery

react 如何引入jquery

引入 jQuery 到 React 项目 在 React 项目中引入 jQuery 可以通过多种方式实现,但需要注意 React 和 jQuery 操作 DOM 的方式可能冲突,因此建议仅在必要时使用…

react如何安装

react如何安装

安装React的步骤 确保已安装Node.js(建议版本12或更高),可通过以下命令检查版本: node -v npm -v 使用Create React App快速搭建项目(推荐): npx c…

如何关闭react

如何关闭react

关闭React应用的步骤 在开发或运行React应用时,可能需要关闭正在运行的开发服务器或停止应用。以下是几种常见情况的处理方法: 停止开发服务器 如果正在使用npm start或yarn star…

vscode如何配置react

vscode如何配置react

配置 VSCode 进行 React 开发 安装必要插件 ES7+ React/Redux/React-Native snippets:提供 React 代码片段快速生成功能。 Prettier -…

react 如何使用 apply

react 如何使用 apply

使用 apply 方法的基本概念 在 JavaScript 中,apply 是函数原型上的方法,用于调用函数时指定 this 的值和传递参数数组。React 中可以使用 apply 来绑定组件方法或调…

react run如何搭配

react run如何搭配

运行 React 项目的常见方法 使用 create-react-app 脚手架 通过官方脚手架工具快速初始化项目并运行开发服务器: npx create-react-app my-app cd…