WHAT - TanStack 前端工具库合集

发布于:2025-06-28 ⋅ 阅读:(16) ⋅ 点赞:(0)

WHAT - react-query(TanStack Query) vs swr 请求 中我们介绍过 TanStack Query. 其实 TanStack 是一个由 Tanner Linsley 创建的前端工具库合集,专注于构建高质量、可组合、无状态的 UI 工具。

最常见和广泛使用的几个 TanStack 项目包括:


常见的 TanStack 库

库名 简介
React Query(TanStack Query) 用于在 React 应用中处理异步数据(请求、缓存、同步、状态管理等),比如对 REST API 或 GraphQL 的数据拉取、缓存、刷新等
TanStack Table 无 UI 的表格逻辑库,支持分页、排序、过滤、虚拟滚动等功能,可以搭配任意 UI 框架使用(如 React、Vue)
TanStack Router 新一代的文件驱动式 React 路由器,支持类型安全、数据加载、权限控制等高级功能
TanStack Virtual 高性能虚拟滚动库,适合用于长列表/大表格的优化
TanStack Form(未正式发布) 正在开发中的表单状态管理库,目标是无状态、可组合、类型安全的表单体验

特点

  • 无 UI:只提供逻辑和状态,UI 自定义权完全交给开发者
  • 类型安全:对 TypeScript 有极佳支持
  • 高性能:内部设计注重最小化重渲染和资源消耗
  • 框架无关(部分):如 Table 和 Virtual 支持 React、Vue、Solid 等框架

官方网站与资源

TanStack Query(React Query)

使用示例:

import { useQuery } from '@tanstack/react-query';

const fetchUser = async () => {
  const res = await fetch('/api/user');
  return res.json();
};

function Profile() {
  const { data, isLoading, error } = useQuery({
    queryKey: ['user'],
    queryFn: fetchUser,
  });

  if (isLoading) return <p>Loading...</p>;
  if (error) return <p>Error: {error.message}</p>;

  return <div>Username: {data.name}</div>;
}

TanStack Table

无 UI 表格库,只负责表格的核心逻辑(列定义、行、排序、过滤等)。

示例:React + TanStack Table v8

import React from 'react';
import {
  useReactTable,
  getCoreRowModel,
  flexRender,
  ColumnDef,
} from '@tanstack/react-table';

type Person = {
  firstName: string;
  lastName: string;
  age: number;
};

const data: Person[] = [
  { firstName: 'Alice', lastName: 'Smith', age: 28 },
  { firstName: 'Bob', lastName: 'Jones', age: 35 },
];

const columns: ColumnDef<Person>[] = [
  {
    header: 'Name',
    columns: [
      { accessorKey: 'firstName', header: 'First Name' },
      { accessorKey: 'lastName', header: 'Last Name' },
    ],
  },
  { accessorKey: 'age', header: 'Age' },
];

export default function MyTable() {
  const table = useReactTable({
    data,
    columns,
    getCoreRowModel: getCoreRowModel(),
  });

  return (
    <table>
      <thead>
        {table.getHeaderGroups().map(headerGroup => (
          <tr key={headerGroup.id}>
            {headerGroup.headers.map(header => (
              <th key={header.id}>
                {flexRender(header.column.columnDef.header, header.getContext())}
              </th>
            ))}
          </tr>
        ))}
      </thead>
      <tbody>
        {table.getRowModel().rows.map(row => (
          <tr key={row.id}>
            {row.getVisibleCells().map(cell => (
              <td key={cell.id}>
                {flexRender(cell.column.columnDef.cell, cell.getContext())}
              </td>
            ))}
          </tr>
        ))}
      </tbody>
    </table>
  );
}

重点:样式完全由你控制。


TanStack Virtual

高性能虚拟滚动,只渲染可见区域的元素。

示例:React 虚拟列表

import React, { useRef } from 'react';
import { useVirtualizer } from '@tanstack/react-virtual';

const rows = new Array(10_000).fill(true).map((_, i) => `Row ${i}`);

export default function VirtualList() {
  const parentRef = useRef<HTMLDivElement>(null);

  const rowVirtualizer = useVirtualizer({
    count: rows.length,
    getScrollElement: () => parentRef.current,
    estimateSize: () => 35,
  });

  return (
    <div
      ref={parentRef}
      style={{
        height: '400px',
        overflow: 'auto',
        border: '1px solid #ddd',
      }}
    >
      <div
        style={{
          height: `${rowVirtualizer.getTotalSize()}px`,
          position: 'relative',
        }}
      >
        {rowVirtualizer.getVirtualItems().map(virtualRow => (
          <div
            key={virtualRow.key}
            ref={virtualRow.measureElement}
            style={{
              position: 'absolute',
              top: 0,
              left: 0,
              width: '100%',
              transform: `translateY(${virtualRow.start}px)`,
              borderBottom: '1px solid #eee',
            }}
          >
            {rows[virtualRow.index]}
          </div>
        ))}
      </div>
    </div>
  );
}

只渲染可视区域,即使1万条也不卡。


TanStack Router

现代化路由库,支持数据加载、类型安全和文件路由。

示例:React 基础路由配置

import {
  createRouter,
  RouterProvider,
  Route,
} from '@tanstack/react-router';
import { lazy } from 'react';
import React from 'react';
import ReactDOM from 'react-dom/client';

// 路由配置
const rootRoute = new Route({
  getParentRoute: () => undefined,
  path: '/',
  component: () => <div>Home</div>,
});

const aboutRoute = new Route({
  getParentRoute: () => undefined,
  path: '/about',
  component: () => <div>About</div>,
});

const router = createRouter({
  routeTree: rootRoute.addChildren([aboutRoute]),
});

// App 入口
ReactDOM.createRoot(document.getElementById('root')!).render(
  <RouterProvider router={router} />
);

它支持更复杂的 loader、error boundary、路由嵌套。


TanStack Form(目前还在开发预览阶段)

这个库还没有正式稳定版,不少开发者仍在观望。


网站公告

今日签到

点亮在社区的每一天
去签到