当前位置:首页 > 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,
    // 添加自定义方法或状态
  };
}

完整示例

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

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 可以增强类型检查
  • 可扩展性:预留扩展点以支持未来需求变更
  • 测试覆盖:确保核心逻辑有充分的单元测试

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

react如何封装usetable

标签: reactusetable
分享给朋友:

相关文章

react中monent如何获取日期

react中monent如何获取日期

使用 Moment.js 获取当前日期 在 React 中通过 Moment.js 获取当前日期,可以直接调用 moment() 函数。它会返回包含当前日期和时间的 Moment 对象。 impor…

如何生成react代码

如何生成react代码

使用 Create React App 生成项目 安装 Node.js 后,通过命令行工具运行以下命令创建新项目: npx create-react-app my-app cd my-app np…

react如何部署

react如何部署

部署 React 应用的常见方法 使用静态服务器部署 React 应用在构建后会生成静态文件,可以直接通过静态服务器部署。常用的静态服务器包括 Nginx、Apache 等。 运行构建命令生成静态文…

react如何收录

react如何收录

React 收录方法 React 的收录主要涉及搜索引擎优化(SEO)和预渲染技术。由于 React 是单页应用(SPA),默认情况下内容由 JavaScript 动态生成,可能导致搜索引擎爬虫难以收…

如何开发react

如何开发react

开发React应用的基本步骤 安装Node.js和npm 确保系统中已安装Node.js(包含npm)。可通过官网下载安装包,安装后验证版本: node -v npm -v 创建React项目…

理解如何react

理解如何react

理解React的核心概念 React是一个用于构建用户界面的JavaScript库,专注于通过组件化开发提高代码的可维护性和复用性。其核心思想包括虚拟DOM(Virtual DOM)和单向数据流,能够…