当前位置:首页 > React

react如何封装usetable

2026-02-11 23:33:17React

封装 useTable Hook 的方法

在 React 中封装 useTable Hook 可以简化表格组件的逻辑,提高代码复用性。以下是几种常见的封装方法:

基础封装

创建一个自定义 Hook,接收表格数据、列配置和分页参数,返回表格渲染所需的属性和方法。

import { useState } from 'react';

function useTable(data, columns, initialPageSize = 10) {
  const [pageIndex, setPageIndex] = useState(0);
  const [pageSize, setPageSize] = useState(initialPageSize);

  const paginatedData = data.slice(
    pageIndex * pageSize,
    (pageIndex + 1) * pageSize
  );

  return {
    tableProps: {
      data: paginatedData,
      columns,
    },
    paginationProps: {
      pageIndex,
      pageSize,
      total: data.length,
      setPageIndex,
      setPageSize,
    },
  };
}

支持排序

扩展 Hook 以支持列排序功能。

function useTable(data, columns) {
  const [sortConfig, setSortConfig] = useState({ key: null, direction: 'asc' });

  const sortedData = [...data].sort((a, b) => {
    if (!sortConfig.key) return 0;
    if (a[sortConfig.key] < b[sortConfig.key]) {
      return sortConfig.direction === 'asc' ? -1 : 1;
    }
    if (a[sortConfig.key] > b[sortConfig.key]) {
      return sortConfig.direction === 'asc' ? 1 : -1;
    }
    return 0;
  });

  const requestSort = key => {
    setSortConfig(prev => ({
      key,
      direction: prev.key === key && prev.direction === 'asc' ? 'desc' : 'asc',
    }));
  };

  return {
    data: sortedData,
    columns,
    sortConfig,
    requestSort,
  };
}

集成 react-table

对于复杂表格需求,可以基于 react-table 库进行封装。

import { useTable } from 'react-table';

function useCustomTable({ columns, data, initialState = {} }) {
  const instance = useTable({
    columns,
    data,
    initialState,
  });

  return {
    ...instance,
    // 添加自定义方法或状态
  };
}

完整示例

结合分页、排序和过滤功能的完整封装示例。

react如何封装usetable

import { useState, useMemo } from 'react';

function useTable(data, columns, options = {}) {
  const { initialPageSize = 10, initialSort } = options;
  const [pageIndex, setPageIndex] = useState(0);
  const [pageSize, setPageSize] = useState(initialPageSize);
  const [sortConfig, setSortConfig] = useState(initialSort);
  const [filter, setFilter] = useState('');

  const filteredData = useMemo(() => {
    if (!filter) return data;
    return data.filter(item =>
      columns.some(col =>
        String(item[col.accessor]).toLowerCase().includes(filter.toLowerCase())
      )
    );
  }, [data, filter, columns]);

  const sortedData = useMemo(() => {
    if (!sortConfig) return filteredData;
    return [...filteredData].sort((a, b) => {
      if (a[sortConfig.key] < b[sortConfig.key]) {
        return sortConfig.direction === 'asc' ? -1 : 1;
      }
      if (a[sortConfig.key] > b[sortConfig.key]) {
        return sortConfig.direction === 'asc' ? 1 : -1;
      }
      return 0;
    });
  }, [filteredData, sortConfig]);

  const paginatedData = useMemo(() => {
    return sortedData.slice(pageIndex * pageSize, (pageIndex + 1) * pageSize);
  }, [sortedData, pageIndex, pageSize]);

  return {
    tableProps: {
      data: paginatedData,
      columns,
      sortConfig,
    },
    paginationProps: {
      pageIndex,
      pageSize,
      total: sortedData.length,
      setPageIndex,
      setPageSize,
    },
    sortProps: {
      setSortConfig,
    },
    filterProps: {
      filter,
      setFilter,
    },
  };
}

使用注意事项

  • 性能优化:对于大数据集,使用 useMemo 缓存计算结果
  • 类型安全:使用 TypeScript 可以增强类型检查
  • 可扩展性:预留扩展点以支持未来需求变更
  • 测试覆盖:确保核心逻辑有充分的单元测试

以上封装方法可以根据实际项目需求进行调整和扩展。

标签: reactusetable
分享给朋友:

相关文章

react中monent如何获取日期

react中monent如何获取日期

使用 Moment.js 获取日期 在 React 项目中,可以通过 Moment.js 库轻松处理日期和时间。以下是几种常见的日期获取方法。 安装 Moment.js 确保项目中已安装 Momen…

react 如何引入css

react 如何引入css

在 React 中引入 CSS 的方法 React 提供了多种引入 CSS 的方式,可以根据项目需求选择合适的方法。以下是常见的几种方式: 内联样式 内联样式直接在组件中通过 style 属性定义,…

react 如何引入jquery

react 如何引入jquery

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

如何改造react

如何改造react

改造 React 项目的关键方法 分析当前项目结构 通过评估现有组件、状态管理和依赖项,明确需要改进的部分。使用工具如 webpack-bundle-analyzer 识别性能瓶颈。 升级 Reac…

react如何安装

react如何安装

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

react如何打包

react如何打包

打包 React 项目的基本步骤 React 项目通常使用 create-react-app 或类似的脚手架工具创建,这些工具内置了打包功能。以下是打包 React 项目的详细方法: 安装依赖并构建…