尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

基于 React 19 + TypeScript + Vite 构建可搜索、可分页的用户数据表格(data-table-app 实战指南)

发布时间:2026/9/30 1:45:46

资讯中心
01
ARTICLE

基于 React 19 + TypeScript + Vite 构建可搜索、可分页的用户数据表格(data-table-app 实战指南)

基于 React 19 + TypeScript + Vite 构建可搜索、可分页的用户数据表格(data-table-app 实战指南)
前端教程文档【免费下载链接】reactjs-interview-questionsList of top 500 ReactJS Interview Questions Answers....Coding exercise questions are coming soon!!项目地址https://gitcode.com/GitHub_Trending/re/reactjs-interview-questions点击查看免费下载本文以仓库中的>import { defineConfig } from vite import react from vitejs/plugin-react export default defineConfig({ plugins: [react()], })vitejs/plugin-react提供 JSX 转换与 Fast RefreshHMR。如需扩展如路径别名、代理 API可在此文件按 Vite 官方约定追加resolve.alias或server.proxy。TypeScript 工程引用根 tsconfig.json 采用 Project References 方式管理两个子配置tsconfig.app.json覆盖src应用代码。关键选项包括target: es2023、lib: [ES2023, DOM]、moduleResolution: bundler、jsx: react-jsx、verbatimModuleSyntax: true强制使用import type导入纯类型并开启noUnusedLocals/noUnusedParameters/noFallthroughCasesInSwitch等严格检查include: [src]。tsconfig.node.json覆盖vite.config.ts等 Node 侧文件module: nodenext、types: [node]。tsc -b会按引用关系依次增量构建两个子项目这是npm run build能同时完成类型门禁的原因。Oxlint 与 README 中的类型感知规则data-table-app的 README 是 Vite 官方模板说明重点讲解了 Oxlint 的扩展方式。Oxlint 是 Oxc 生态的高性能 lint 器仓库lint脚本直接调用oxlint。官方建议开发生产级应用时安装oxlint-tsgolint并在.oxlintrc.json中启用类型感知规则{ $schema: ./node_modules/oxlint/configuration_schema.json, plugins: [react, typescript, oxc], options: { typeAware: true }, rules: { react/rules-of-hooks: error, react/only-export-components: [warn, { allowConstantExport: true }] } }其中react/rules-of-hooks强制遵守 Hooks 调用规则顶层调用、不可条件调用与本应用大量使用 Hooks 的写法直接相关react/only-export-components约束组件文件只导出组件允许常量导出利于 Fast Refresh 生效。未开启typeAware时 Oxlint 仍可用但无法执行需要类型信息的规则这是模板明确提示的取舍。数据层类型定义与远程获取User 类型types/user.ts 定义了表格行数据的形状company为嵌套对象后续表格列即取自这些字段export interface User { id: number; name: string; email: string; phone: string; website: string; company: { name: string; }; }数据服务services/userService.ts 使用原生fetch请求公开占位 APIconst API_URL https://jsonplaceholder.typicode.com/users; export const getUsers async (): PromiseUser[] { const response await fetch(API_URL); if (!response.ok) { throw new Error(Failed to fetch users); } return response.json(); };要点未使用 axios 等第三方库直接以fetch完成显式检查response.ok失败时抛出统一错误信息由上层捕获展示。实际项目中可将API_URL改为环境变量如import.meta.env.VITE_API_URL以适配不同环境。组件实现SearchBar、DataTable 与 Pagination三个组件均为无状态受控纯展示组件通过 props 接收数据与回调符合 React 推荐的单向数据流。SearchBar受控搜索框components/SearchBar.tsx 是典型受控组件value来自父组件onChange把输入值上抛interface SearchBarProps { value: string; onChange: (value: string) void; } export function SearchBar({ value, onChange }: SearchBarProps) { return ( input typetext placeholderSearch users value{value} onChange{(e) onChange(e.target.value)} / ); }DataTable表格渲染components/DataTable.tsx 接收users: User[]渲染 5 列表头Id / Name / Email / Phone / Company列表为空时显示跨列colSpan{5}的 No users found 占位行避免空表格困惑{users.length 0 ? ( trtd colSpan{5} classNameemptyNo users found/td/tr ) : users.map((user) ( tr key{user.id} td{user.id}/td td{user.name}/td td{user.email}/td td{user.phone}/td td{user.company.name}/td /tr ))}使用user.id作为key是稳定且唯一的正确选择。Pagination分页控制components/Pagination.tsx 提供 Prev / Next 两个按钮与页码指示并在边界禁用按钮interface PaginationProps { currentPage: number; totalPages: number; onPageChange: (page: number) void; } button disabled{currentPage 1} onClick{() onPageChange(currentPage - 1)}Prev/button spanPage {currentPage} of {totalPages}/span button disabled{currentPage totalPages} onClick{() onPageChange(currentPage 1)}Next/button第一页时 Prev 禁用、最后一页时 Next 禁用避免越界切换。状态编排App 组件中的数据流src/App.tsx 是整个应用的状态中枢同时管理四类状态users: User[]—— 异步拉取的全量数据search: string—— 搜索关键字currentPage: number—— 当前页码从 1 开始loading: boolean、error: string—— 请求期状态。异步取数useEffect在挂载后调用loadUsers先setLoading(true)成功则setUsers失败则将Error实例的message写入错误状态finally中复位 loadinguseEffect(() { const loadUsers async () { try { setLoading(true); const users await getUsers(); setUsers(users); } catch (error) { SetError(error instanceof Error ? error.message : Something went wrong); } finally { setLoading(false); } }; loadUsers(); }, []);依赖数组为空表示仅在首次渲染执行一次。error instanceof Error的判断确保非标准错误对象也能安全兜底。注意App.tsx中loading div.../div这类表达式因缺少return并不会真正渲染实际加载/错误提示应放在 JSX 返回结构中实现。搜索过滤useMemo 缓存派生数据过滤逻辑封装在useMemo中依赖[search, users]关键字先trim().toLowerCase()归一化再对name、email、company.name三个字段做includes匹配const filteredUsers useMemo(() { const query search.trim().toLowerCase(); if (!query) return users; return users.filter( (user) user.name.includes(query) || user.email.includes(query) || user.company.name.includes(query), ); }, [search, users]);useMemo保证只有search或users变化时才重新过滤避免每次渲染都重复 O(n) 遍历是面试中何时使用useMemo的标准答案示例。分页切片totalPages由Math.ceil(filteredUsers.length / PAGE_SIZE)计算每页 5 条当前页数据同样用useMemo切片start (currentPage - 1) * PAGE_SIZEconst totalPages Math.ceil(filteredUsers.length / PAGE_SIZE); const paginatedUsers useMemo(() { const start (currentPage - 1) * PAGE_SIZE; return filteredUsers.slice(start, start PAGE_SIZE); }, [currentPage, filteredUsers]);交互联动两个回调把子组件事件接入状态handleSearch更新search的同时把currentPage重置为 1保证搜索后总是从第一页看结果handlePageChange更新页码。搜索重置页码是分页应用最常见的坑点之一这里的处理是正确范例。渲染时只有totalPages 1才显示分页器避免单页场景出现无意义的控件。入口与运行链路src/main.tsx 是 React 挂载入口使用 React 19 推荐的createRootAPI 并开启StrictModecreateRoot(document.getElementById(root)!).render( StrictMode App / /StrictMode, );public/index.html 中div idroot/div为挂载点script typemodule src/src/main.tsx/script加载入口。整体调用链为index.html → main.tsx → App.tsx → (SearchBar / DataTable / Pagination) → userService.getUsers()数据自服务层流入状态再经过滤、切片流向展示组件链路清晰、易于追踪。小结与延伸data-table-app用约十个文件完整示范了现代 React 前端的最小闭环异步数据获取useEffectfetch、派生数据缓存useMemo、受控组件SearchBar、展示组件拆分DataTable/Pagination与状态联动搜索重置页码。配合 Vite 的极速 HMR、tsc -b类型门禁与 Oxlint 静态检查可无痛扩展到真实管理后台。若想继续深化可参考仓库中其他编码项目如 coding-projects/todo-app、coding-projects/infinite-scroll-app对比不同的数据流组织方式也可将搜索改为防抖、分页改为服务端分页作为进阶练习。赞分享前端教程文档【免费下载链接】reactjs-interview-questionsList of top 500 ReactJS Interview Questions Answers....Coding exercise questions are coming soon!!项目地址https://gitcode.com/GitHub_Trending/re/reactjs-interview-questions点击查看免费下载相关推荐10分钟跑通 ok-ww 鸣潮自动战斗脚本自动刷声骸、一键清日常完整教程10分钟跑通 ok ww 鸣潮自动战斗脚本自动刷声骸、一键清日常完整教程 打开《鸣潮》只剩半小时日常却还要两小时ok ww 是一款开源的鸣潮自动化脚本靠GUI 自动化计算机视觉RPA人工智能Flowbite Datatables 插件实战指南基于 Tailwind CSS 构建可搜索、排序、筛选、分页与导出的数据表格Flowbite Datatables 插件实战指南基于 Tailwind CSS 构建可搜索、排序、筛选、分页与导出的数据表格 本指南以 FlowbiteUI组件前端Vben Vxe Table在 vue-vben-admin 中用共享 API 构建可搜索数据表格Vben Vxe Table在 vue vben admin 中用共享 API 构建可搜索数据表格 Vben Vxe Table 是 vue vben adm前端上一篇5分钟上手LaspVfxUnity音频驱动VFX的快速入门教程下一篇从0到1掌握Kubernetes生态利器Contrib组件实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。