ChartDB分页组件:大数据集分页显示

ChartDB分页组件:大数据集分页显示

【免费下载链接】chartdb Database diagrams editor that allows you to visualize and design your DB with a single query. 【免费下载链接】chartdb 项目地址: https://gitcode.com/GitHub_Trending/ch/chartdb

概述

在数据库可视化工具ChartDB中,处理大规模数据集的分页显示是一个核心功能需求。当用户需要从包含数百甚至数千张表的数据库中导入数据时,高效的分页机制能够显著提升用户体验和系统性能。ChartDB采用基于React的现代化分页组件,结合智能数据管理策略,为大数据集提供了流畅的分页浏览体验。

分页组件架构

ChartDB的分页系统采用模块化设计,主要包含以下核心组件:

mermaid

核心功能实现

1. 分页状态管理

ChartDB使用React Hooks进行状态管理,确保分页逻辑的响应性和性能:

const [currentPage, setCurrentPage] = useState(1);
const [searchTerm, setSearchTerm] = useState('');
const [showTables, setShowTables] = useState(true);
const [showViews, setShowViews] = useState(false);
const [selectedTables, setSelectedTables] = useState<Set<string>>(new Set());

2. 数据分页计算

通过useMemo优化分页计算,避免不必要的重渲染:

const totalPages = useMemo(
    () => Math.max(1, Math.ceil(filteredTables.length / TABLES_PER_PAGE)),
    [filteredTables.length]
);

const paginatedTables = useMemo(() => {
    const startIndex = (currentPage - 1) * TABLES_PER_PAGE;
    const endIndex = startIndex + TABLES_PER_PAGE;
    return filteredTables.slice(startIndex, endIndex);
}, [filteredTables, currentPage]);

3. 分页UI组件

ChartDB提供完整的分页UI组件库:

import {
    Pagination,
    PaginationContent,
    PaginationItem,
    PaginationPrevious,
    PaginationNext,
} from '@/components/pagination/pagination';

性能优化策略

1. 智能数据筛选

const filteredTables = useMemo(() => {
    let filtered = allTables;
    
    // 类型过滤
    filtered = filtered.filter((table) => {
        if (table.type === 'table' && !showTables) return false;
        if (table.type === 'view' && !showViews) return false;
        return true;
    });
    
    // 搜索过滤
    if (searchTerm.trim()) {
        const searchLower = searchTerm.toLowerCase();
        filtered = filtered.filter(
            (table) =>
                table.tableName.toLowerCase().includes(searchLower) ||
                table.schema?.toLowerCase().includes(searchLower) ||
                table.fullName.toLowerCase().includes(searchLower)
        );
    }
    
    return filtered;
}, [allTables, searchTerm, showTables, showViews]);

2. 内存优化

通过Set数据结构管理选中状态,确保O(1)时间复杂度的查找操作:

const handleTableToggle = useCallback((tableKey: string) => {
    const newSelected = new Set(selectedTables);
    if (newSelected.has(tableKey)) {
        newSelected.delete(tableKey);
    } else if (selectedTables.size < MAX_TABLES_IN_DIAGRAM) {
        newSelected.add(tableKey);
    }
    setSelectedTables(newSelected);
}, [selectedTables]);

分页配置参数

参数名称类型默认值描述
TABLES_PER_PAGEnumber10每页显示的表数量
MAX_TABLES_IN_DIAGRAMnumber500最大可导入表数量
MAX_TABLES_WITHOUT_SHOWING_FILTERnumber50自动显示过滤器的阈值

使用示例

基本分页实现

const SelectTablesComponent: React.FC = () => {
    const [currentPage, setCurrentPage] = useState(1);
    const TABLES_PER_PAGE = 10;
    
    const totalPages = Math.ceil(filteredTables.length / TABLES_PER_PAGE);
    const paginatedTables = filteredTables.slice(
        (currentPage - 1) * TABLES_PER_PAGE,
        currentPage * TABLES_PER_PAGE
    );
    
    const handleNextPage = () => {
        if (currentPage < totalPages) {
            setCurrentPage(currentPage + 1);
        }
    };
    
    const handlePrevPage = () => {
        if (currentPage > 1) {
            setCurrentPage(currentPage - 1);
        }
    };
    
    return (
        <Pagination>
            <PaginationContent>
                <PaginationItem>
                    <PaginationPrevious 
                        onClick={handlePrevPage}
                        disabled={currentPage === 1}
                    />
                </PaginationItem>
                <PaginationItem>
                    <span>Page {currentPage} of {totalPages}</span>
                </PaginationItem>
                <PaginationItem>
                    <PaginationNext 
                        onClick={handleNextPage}
                        disabled={currentPage >= totalPages}
                    />
                </PaginationItem>
            </PaginationContent>
        </Pagination>
    );
};

高级分页功能

// 页面选择切换
const handleTogglePageSelection = useCallback(() => {
    const newSelected = new Set(selectedTables);
    const allVisibleSelected = visibleSelectedTables.length === paginatedTables.length;
    
    if (allVisibleSelected) {
        // 取消选择当前页所有表
        for (const table of paginatedTables) {
            newSelected.delete(table.key);
        }
    } else {
        // 选择当前页所有表
        for (const table of paginatedTables) {
            if (newSelected.size >= MAX_TABLES_IN_DIAGRAM) break;
            newSelected.add(table.key);
        }
    }
    setSelectedTables(newSelected);
}, [paginatedTables, selectedTables]);

响应式设计

ChartDB分页组件支持响应式布局,在不同设备上提供最佳用户体验:

const { isMd: isDesktop } = useBreakpoint('md');

const renderPagination = () => (
    <Pagination>
        <PaginationContent>
            <PaginationItem>
                <PaginationPrevious onClick={handlePrevPage} />
            </PaginationItem>
            <PaginationItem>
                <span>Page {currentPage} of {totalPages}</span>
            </PaginationItem>
            <PaginationItem>
                <PaginationNext onClick={handleNextPage} />
            </PaginationItem>
        </PaginationContent>
    </Pagination>
);

// 桌面端和移动端不同的分页位置
{isDesktop ? renderPagination() : null}

最佳实践

1. 搜索优化

// 搜索时重置到第一页
useEffect(() => {
    setCurrentPage(1);
}, [searchTerm]);

2. 性能监控

// 监控分页性能
const paginationPerformance = useMemo(() => {
    return {
        totalItems: allTables.length,
        filteredItems: filteredTables.length,
        currentPageItems: paginatedTables.length,
        selectionCount: selectedTables.size,
        memoryUsage: calculateMemoryUsage(selectedTables)
    };
}, [allTables, filteredTables, paginatedTables, selectedTables]);

3. 错误处理

const handlePageChange = (newPage: number) => {
    if (newPage < 1 || newPage > totalPages) {
        console.warn(`Invalid page number: ${newPage}`);
        return;
    }
    setCurrentPage(newPage);
};

总结

ChartDB的分页组件通过以下特性为大数据集处理提供了完整解决方案:

  1. 模块化设计 - 可重用的分页UI组件
  2. 性能优化 - 使用Memoization和高效数据结构
  3. 响应式支持 - 自适应不同屏幕尺寸
  4. 智能过滤 - 结合搜索和类型过滤
  5. 内存管理 - 优化大规模数据集处理

通过合理配置分页参数和采用最佳实践,ChartDB能够高效处理包含数千张表的大型数据库,为用户提供流畅的数据浏览和选择体验。

【免费下载链接】chartdb Database diagrams editor that allows you to visualize and design your DB with a single query. 【免费下载链接】chartdb 项目地址: https://gitcode.com/GitHub_Trending/ch/chartdb

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值