首页 > 其他分享 >强大的无头UI表格库:TanStack Table!Github Star达到了惊人的25K!

强大的无头UI表格库:TanStack Table!Github Star达到了惊人的25K!

时间:2024-10-15 16:35:08浏览次数:8  
标签:25K Github Star 表格 props UI columnHelper TanStack Table

强大的无头UI表格库:TanStack Table!Github Star达到了惊人的25K!

在构建现代化 Web 应用时,表格数据网格是常见的 UI 组件,特别是在处理大量数据或需要复杂交互时,选择合适的表格库尤为重要。TanStack Table 是一款功能强大的 Headless UI 表格库,支持 TypeScript/JavaScriptReactVueSolidQwikSvelte 等多种框架。它提供了极高的灵活性和扩展性,适用于各种复杂的数据展示需求。它不仅可以处理简单的表格,还能够通过其高度可扩展的 API 满足复杂的数据网格需求。无论是分页排序过滤,还是多维分组虚拟滚动,它都能灵活应对,同时保持高效的性能表现。

今天,我们将深入介绍 TanStack Table,分析其显著特性、使用方式及适用场景,探讨为什么它是各大前端框架开发者的不二选择。
image

显著特性

  • 支持React、Vue、Solid 的一流框架绑定
  • ~15kb 或更少(使用 tree-shaking)
  • 100% TypeScript(但不是必需的)
  • 无头(100% 可定制,自带 UI)
  • 自动开箱即用,选择加入可控状态
  • 过滤器(列和全局)
  • 排序(多列、多方向)
  • 分组和聚合
  • 旋转(即将推出!)
  • 行选择
  • 行扩展
  • 列可见性/排序/固定/调整大小
  • 表分割
  • 可动画化
  • 可虚拟化
  • 服务器端/外部数据模型支持

为什么选择 TanStack Table?

  1. 多框架兼容,适用广泛

TanStack Table 支持多种前端框架,不管你是使用 React、Vue,还是新兴的 Solid 和 Svelte,都可以无缝集成。这种跨框架的能力使得它在不同技术栈项目中都非常适用。

  1. 轻量高效,性能优越

与其他捆绑了大量 UI 元素和功能的表格库不同,TanStack Table 保持了核心的轻量化,同时提供丰富的功能模块供按需加载。它的虚拟滚动功能在处理大数据集时尤为出色,确保用户交互的流畅性。

  1. 无 UI 限制,自定义能力强

对于那些需要高度定制化的项目,TanStack TableHeadless架构提供了极大的灵活性。你可以根据项目的具体需求,自由选择和设计表格的外观,而不被库自带的 UI 所限制。

  1. 扩展性强,满足复杂需求

无论是简单的数据展示,还是复杂的数据网格应用,TanStack Table 的插件扩展机制和高度可定制的 API 都能满足你的需求。你可以在不修改核心代码的情况下,快速实现复杂的功能需求。

适用场景

  1. 跨框架项目

TanStack Table 不局限于单一框架,它支持多种前端框架,如 React、Vue、Svelte、Solid 等,非常适合那些跨框架或需要高复用性的项目。

  1. 处理大数据集的应用

TanStack Table 轻量且支持虚拟滚动,在处理大数据集时,它能够仅渲染可视区域的数据,极大提升了性能表现。特别适合电商、管理系统等需要展示大量数据的应用场景。

  1. 需要高度定制表格样式的项目

如果项目对表格的外观有特定要求,TanStack Table 的无 UI 设计让你可以自由定制表格样式。结合你喜欢的 UI 库或自定义组件,打造完全符合需求的表格组件。

  1. 数据网格和复杂交互的场景

TanStack Table 提供了丰富的 API 和插件机制,支持复杂的数据交互逻辑,比如多维分组拖拽排序等功能,非常适合在 SaaS管理系统等需要处理复杂数据的场景中使用。

使用方式

安装

npm install @tanstack/vue-table

使用组件

image

比如,要实现上述复杂表格效果,需要用到的应用代码如下:

<script setup lang="ts">
import {
  FlexRender,
  getCoreRowModel,
  useVueTable,
  createColumnHelper,
} from '@tanstack/vue-table'
import { ref } from 'vue'

type Person = {
  firstName: string
  lastName: string
  age: number
  visits: number
  status: string
  progress: number
}

const defaultData: Person[] = [
  {
    firstName: 'tanner',
    lastName: 'linsley',
    age: 24,
    visits: 100,
    status: 'In Relationship',
    progress: 50,
  },
  {
    firstName: 'tandy',
    lastName: 'miller',
    age: 40,
    visits: 40,
    status: 'Single',
    progress: 80,
  },
  {
    firstName: 'joe',
    lastName: 'dirte',
    age: 45,
    visits: 20,
    status: 'Complicated',
    progress: 10,
  },
]

const columnHelper = createColumnHelper<Person>()

const columns = [
  columnHelper.group({
    header: 'Name',
    footer: props => props.column.id,
    columns: [
      columnHelper.accessor('firstName', {
        cell: info => info.getValue(),
        footer: props => props.column.id,
      }),
      columnHelper.accessor(row => row.lastName, {
        id: 'lastName',
        cell: info => info.getValue(),
        header: () => 'Last Name',
        footer: props => props.column.id,
      }),
    ],
  }),
  columnHelper.group({
    header: 'Info',
    footer: props => props.column.id,
    columns: [
      columnHelper.accessor('age', {
        header: () => 'Age',
        footer: props => props.column.id,
      }),
      columnHelper.group({
        header: 'More Info',
        columns: [
          columnHelper.accessor('visits', {
            header: () => 'Visits',
            footer: props => props.column.id,
          }),
          columnHelper.accessor('status', {
            header: 'Status',
            footer: props => props.column.id,
          }),
          columnHelper.accessor('progress', {
            header: 'Profile Progress',
            footer: props => props.column.id,
          }),
        ],
      }),
    ],
  }),
]

const data = ref(defaultData)

const rerender = () => {
  data.value = defaultData
}

const table = useVueTable({
  get data() {
    return data.value
  },
  columns,
  getCoreRowModel: getCoreRowModel(),
})
</script>

<template>
  <div class="p-2">
    <table>
      <thead>
        <tr
          v-for="headerGroup in table.getHeaderGroups()"
          :key="headerGroup.id"
        >
          <th
            v-for="header in headerGroup.headers"
            :key="header.id"
            :colSpan="header.colSpan"
          >
            <FlexRender
              v-if="!header.isPlaceholder"
              :render="header.column.columnDef.header"
              :props="header.getContext()"
            />
          </th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="row in table.getRowModel().rows" :key="row.id">
          <td v-for="cell in row.getVisibleCells()" :key="cell.id">
            <FlexRender
              :render="cell.column.columnDef.cell"
              :props="cell.getContext()"
            />
          </td>
        </tr>
      </tbody>
      <tfoot>
        <tr
          v-for="footerGroup in table.getFooterGroups()"
          :key="footerGroup.id"
        >
          <th
            v-for="header in footerGroup.headers"
            :key="header.id"
            :colSpan="header.colSpan"
          >
            <FlexRender
              v-if="!header.isPlaceholder"
              :render="header.column.columnDef.footer"
              :props="header.getContext()"
            />
          </th>
        </tr>
      </tfoot>
    </table>
    <div class="h-4" />
    <button @click="rerender" class="border p-2">Rerender</button>
  </div>
</template>

<style>
html {
  font-family: sans-serif;
  font-size: 14px;
}

table {
  border: 1px solid lightgray;
}

tbody {
  border-bottom: 1px solid lightgray;
}

th {
  border-bottom: 1px solid lightgray;
  border-right: 1px solid lightgray;
  padding: 2px 4px;
}

tfoot {
  color: gray;
}

tfoot th {
  font-weight: normal;
}
</style>

结语

TanStack Table 作为一款跨框架的强大表格库,凭借其高性能、轻量化和极致的定制能力,成为了现代 Web 开发中的理想选择。无论是在 React、Vue,还是其他前端框架中,它都能灵活应对复杂的数据展示和交互需求。如果你正在寻找一个可以满足从简单到复杂应用场景的表格库,TanStack Table 无疑是你的不二选择。


该框架已经收录到我的全栈前端一站式开发平台 “前端视界” 中(浏览器搜 前端视界 第一个),感兴趣的欢迎浏览使用!

image

标签:25K,Github,Star,表格,props,UI,columnHelper,TanStack,Table
From: https://www.cnblogs.com/kekobn/p/18467803

相关文章

  • 程序员必看!用 Eagle 读懂 GitHub 项目代码
    程序员一定要学会这一招,悄悄充电,偷是技术大牛,惊艳所有人!作为程序员,GitHub是一定要看的,学习并理解优秀的项目代码,让你事半功倍。一起来看看技术大牛是怎么在GitHub上充电的吧!GitHub上有一个叫Trending的榜单,它会帮你列出最近一天、一周、一个月最火的项目。这些项目一般都有......
  • CAD软件:GstarCAD二次开发
    GstarCAD二次开发入门1.1二次开发概述GstarCAD是一款功能强大的CAD软件,广泛应用于建筑设计、机械制造、电子工程等领域。二次开发是指在现有的GstarCAD软件基础上,通过编程技术扩展其功能,满足特定的业务需求。二次开发可以大大提升工作效率,帮助用户解决复杂的设计问题。......
  • Github和git的学习(不定期更新)
    学习GitHub和Git可以使用GitHub和Git来开展工作协作。[官方文档直达]([GitHub入门文档-GitHub文档](关于Git-GitHub文档))关于GitHubGitHub是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。通过将代码存储在GitHub上的“存储库”中,你将可以:“展......
  • 时隔半年 DotNetGuide 已突破了 6.6K + Star,持续更新,欢迎更多小伙伴PR投稿!
    前言记得今年5月份的时候DotNetGuideGitHub才突破5kStar,经过持续不断地输出时隔半年DotNetGuide已突破了6.6K+Star!并且由我创建的DotNetGuide技术社区微信交流群人数也突破了3200+,非常开心和自豪能够帮助到这么多对C#/.NET感兴趣的小伙伴。之后还是会持续更新,努力输出更......
  • NewStar CTF[pwn] overwrite WriteUp
    IDA打开,查看func()函数,得到以下代码点击查看代码unsigned__int64func(){size_tinput1[6];//[rsp+Ch][rbp-84h]BYREFcharnptr[72];//[rsp+40h][rbp-50h]BYREFunsigned__int64v3;//[rsp+88h][rbp-8h]v3=__readfsqword(0x28u);printf("plsin......
  • github action的使用
    近年来,我一直在使用jenkins来部署自己的项目,发现太耗内存了,因此将自动化部迁的操作改为使用githubaction。初始化action配置选择一个合适的action类型,比如webpack、gitPage、Nodejs等等。比如我这里选择了webpack,选择完成后可以看到在仓库里多了一个文件.github/workflo......
  • 查看Github 发行版下载次数
    比如我在Github上开源了软件,并且在Release里面发布了版本,但是Githubrelease页面并没有下载统计次数的页面展示。下面列举的几个可以查看Release各个版本的下载量。1.https://somsubhra.github.io/github-release-stats/?username=hupo376787&repository=WeiboAlbumDownloader&......
  • Starrocks表的数据库字段类型及与MySQL 的差异
    最近有用到Starrocks,实际使用中基本可以当作mysql来使用,但是数据库字段还是有所不同的。与MySQL相同或相似的基础类型数值类型TINYINT、SMALLINT、INT/INTEGER、BIGINT:在Starrocks和MySQL中的定义和用途基本相似。都是用于存储整数,范围也和MySQL中的对应类型相同,例如TI......
  • Starrocks的表引擎选择及表属性的设置详细说明
    表引擎选择OLAP引擎特点与适用场景:这是StarRocks中用于数据分析场景的主要引擎。它针对海量数据的复杂分析查询进行了优化,能够高效地处理聚合、分组、排序等操作。例如,在数据仓库场景下,当需要对销售数据进行按地区、时间等维度的统计分析时,OLAP引擎能够快速返回结......
  • OP设置SSH-绑定GitHub账户
    OP设置SSH-绑定GitHub账户https://github.com/dragonpilot-community/dragonpilot_wiki/blob/master/cn/how_to_setup_github_ssh.md从0.83开始,安装好OP后会删掉原来通用的ssh密钥信息,无法进行ssh/sftp登录。若需要登录,需要在OP里面绑定GitHub账户里头的ssh公钥。一、快捷偷懒......