@agile-team/mach-table-react

中文文档
0.39.0发布于 2026/11/06SEE LICENSE IN LICENSETypeScriptESM + CJS近 30 天下载 2712

Machtable 企业数据网格的官方反应 18+适配器

中文使用文档
文档目录8 节
  1. 基础接入
  2. 应用配置
  3. 按需加载
  4. 行拖拽与条件整行颜色
  5. 按需高级入口(0.34)
  6. 显示策略与本地合计
  7. 列值与运行边界(自 0.33)
  8. 内容列宽与状态颜色(0.35)

MachTable

@agile-team/mach-table-react

MachTable 0.39.0 的官方 React 18+ 适配包。一个依赖即可获得 Core、泛型 <MachTable>、应用/路由配置、按需工作流、StrictMode 安全清理和最新闭包事件处理。

本地明细设置 domLayout="autoHeight" maxBodyHeight={330} 即可随内容收起,超过 330px 的表体进入虚拟滚动。表内筛选无匹配时可在默认空态中清除筛选。分页继续使用内置分页条。

pnpm add @agile-team/mach-table-react

应用入口只引入一次样式:

import "@agile-team/mach-table-react/styles.css";

基础接入

import { useMemo } from "react";
import { MachTable, useMachTable, type ColDef } from "@agile-team/mach-table-react";

interface Row { id: string; name: string }

export function Customers({ rows }: { rows: Row[] }) {
  const table = useMachTable<Row>();
  const columns = useMemo<ColDef<Row>[]>(
    () => [{ field: "name", flex: 1, editable: true }],
    []
  );

  return (
    <div style={{ height: 520 }}>
      <MachTable<Row>
        apiRef={table.apiRef}
        rowData={rows}
        columnDefs={columns}
        rowKey="id"
        enableColumnResize
        persistence={{ key: "customers:list", sections: ["columns"] }}
      />
    </div>
  );
}

对象型列和配置建议用 useMemo 保持引用稳定。useMachTable() 同时提供 apiRef、响应式 api 与 ready。

默认显示序号和内置分页,可通过 rowNumber={false}、pagination={false} 分别关闭。需要定制序号时直接声明 indexColumn()。

应用配置

// src/config/mach-table.config.ts
import { defineMachTableConfig, defineMachTablePreset } from "@agile-team/mach-table-react";

export default defineMachTableConfig({
  defaults: {
    size: "compact",
    columnLayout: "fit",
    enableColumnResize: true,
    defaultColDef: { sortable: true, filter: true, resizable: true }
  },
  defaultPreset: "list",
  presets: {
    list: defineMachTablePreset({ stripedRows: true }),
    crud: defineMachTablePreset({ rowSelection: "multiple", editType: "fullRow" })
  }
});
<MachTableProvider config={machTableConfig}>
  <App />
</MachTableProvider>

Provider 可按路由/布局嵌套,最近一层覆盖外层,表格 props 优先级最高。

编辑、粘贴、清空和填充复用已有列与整行校验。useMachTableEditing() 隔离重挂载或数据替换前的保存结果、错误和冲突;查询工作流在 StrictMode 下保留 immediate: false,重复设置相同搜索值不会重新请求。

按需加载

React 不模拟全局组件注册。路由本身懒加载时普通 import 已自然拆包;需要独立边界时:

const MachTable = lazy(() => import("@agile-team/mach-table-react"));

可选能力使用子入口:

import { useMachTableQuery, useMachTableEditing } from "@agile-team/mach-table-react/workflows";
import { MachTableToolbar } from "@agile-team/mach-table-react/ui";
import { reactCellRenderer } from "@agile-team/mach-table-react/adapters";
import { createWorkerDataProcessor } from "@agile-team/mach-table-react/worker";
  • /workflows:请求取消、防过期覆盖、服务端分页、跨页选择、脏数据和冲突保存;reset() 清空全部表格过滤且只请求一次。
  • /ui:可选标准工具栏。
  • /adapters:自定义 React cell/detail renderer 桥接。
  • /worker:大型本地过滤/排序的独立 Worker 能力。
const query = useMachTableQuery({
  query: filters,
  queryKey: filters,
  rowKey: "id",
  request: orderApi.page,
  mode: "manual"
});

<MachTable<Row> apiRef={table.apiRef} columnDefs={columns} {...query.bindings} />;

该包自动依赖 @agile-team/mach-table 并重导出 Core 类型;宿主只需提供 react 和 react-dom >= 18。

行拖拽与条件整行颜色

import { dragColumn, type GridOptions } from "@agile-team/mach-table-react";

interface Plan { id: string; name: string; status: string }
const options: GridOptions<Plan> = {
  rowKey: "id",
  columnDefs: [dragColumn(), { field: "name" }, { field: "status" }],
  rowStyleRules: [
    { when: ({ data }) => data.status === "pending", tone: "warning" },
    { when: ({ data }) => data.status === "failed", tone: "danger" },
    { when: ({ data }) => data.status === "done", tone: "success" }
  ]
};

状态码由应用定义,包内不识别业务状态。颜色规则取第一条命中结果,未命中时沿用默认样式;支持自定义背景/文字颜色、固定列、明暗主题、选择和虚拟行复用。拖拽提供主题手柄、落点线、位置浮层、边缘滚动、Esc 取消和 Alt + ↑/↓ 移动。扁平外部数据设置 applyRowDrag: false,由 onRowDragEnd 处理持久化;自动模式先完成移动再发出事件,使用 targetIndex 读取最终下标。树、分组及排序等自动模式限制见完整配方。

文档:React 指南 · 企业接入 · SSR

按需高级入口(0.34)

仍从本包导入,无需另装高级功能包。普通根入口不加载这些实现或附加 CSS。

子路径功能
/workbench高级过滤草稿与应用、修改差异/部分保存/冲突审阅、手动诊断
/preferences复合身份隔离、CAS、有序写入、历史版本及列 ID/类型迁移报告
/ordering多行/树移动、防环与业务约束、失败回滚、持久化撤销/重做
/server-side服务端分组/聚合、route 分页、缓存/刷新/事务及层级选择
/multi-rangeCtrl/Cmd 追加范围、格式化复制、校验清空及撤销
/import有界数据预览、共享同步/异步校验、结构化错误与过期保护
/business范围与币种/单位分组的本地语义合计
/analysisPivot、安全公式、柱/折线图和数据表回退
import { mountAdvancedFilterBuilder } from "@agile-team/mach-table-react/workbench";
import "@agile-team/mach-table-react/styles/workbench.css";

const filters = mountAdvancedFilterBuilder(host, { api });
// 宿主卸载时调用;表格销毁也会释放工作台。
filters.destroy();

服务端分组控件使用 /styles/server-side.css,分析与多范围使用 /styles/workbench.css。排序、偏好和纯分析计算无需附加 CSS。服务端 Store 按 route 分页,不提供全树任意显示 offset;分析只处理当前已加载数据并显示范围。排序 undo/redo 的 transport 必须一次 CAS 保存 context.operations 的完整批次或 context.plan.after,只保存首参数无法完整恢复非连续/跨父级位置。

完整示例与限制:工作台 · 排序 · 企业偏好 · 服务端 Store · 多范围 · 分析。

Source-available © ChenyCHENYU (Agile Team). 任何使用均须事先取得书面授权。详见 LICENSE 与授权流程。

显示策略与本地合计

页面把已准备好的标签与普通格式化函数组合到列上。MachTable 只接收同步函数与普通选项,不持有字典实例、加载服务或订阅协议。异步数据准备与刷新由项目管理。

import { summarizeRows } from "@agile-team/mach-table-react/business";

const labels = new Map([["ready", "已就绪"]]);
const statusColumn = {
  field: "status",
  valueFormatter: ({ value }) => labels.get(String(value)) ?? String(value ?? ""),
  valueSerializer: ({ value, target }) =>
    target === "clipboard" ? labels.get(String(value)) ?? value : value
};
const rows = [{ currency: "CNY", unit: "t", amount: 120, completed: 2, planned: 4 }];
const summary = summarizeRows(rows, {
  scope: "page",
  groupBy: row => JSON.stringify([row.currency, row.unit]),
  metrics: [
    { id: "amount", kind: "sum", value: row => row.amount },
    { id: "count", kind: "count" },
    { id: "completion", kind: "ratio", numerator: row => row.completed, denominator: row => row.planned }
  ]
});

/business 只提供本地语义合计;scope 声明 page/selected/query,实际只处理传入记录。ratio 先汇总分子分母,精确金额可注入 numeric 策略;服务端全量由后端计算。详情见业务列与合计。

列值与运行边界(自 0.33)

ColDef.valueParser 统一编辑、粘贴和导入的规范值;valueSerializer 按 clipboard/csv/xlsx 定义输出,沿用已有 columnTypes 优先级。排序/过滤读取规范值,可信事务与撤销不重复解析。api.io.importMatrix() / exportMatrix() 直传类型,完整导入预览从当前包的 /import 导入 createImportPlan(),不加载到默认入口。

sum / avg / min / max 只聚合有限数,空数值集合返回 null,sum/avg 溢出返回 null;count 计全部记录,空集合为 0。自定义聚合保留原始输入。分组 ID 区分数字/文本/空值,旧展开路径仅在唯一时迁移,歧义报告错误。超大远程滚动使用有界物理坐标,API、滚轮和交互共用逻辑偏移;应用默认配置的 dataProcessor 使用每表工厂。完整边界与升级说明见升级指南。

内容列宽与状态颜色(0.35)

未声明 width 的列默认按表头和已加载数据的显示文本测宽:每列均匀抽样最多 100 行,默认 80–360px,minWidth/maxWidth 可覆盖。长内容在单元格内省略,表格保留内部横向滚动;不为测宽请求远程数据或执行自定义渲染器。格式化文本及状态标签文字都参与测量。图形/操作等特殊列请指定宽度。

const columns = [
  { field: "customer", headerName: "客户", maxWidth: 280 },
  { field: "status", headerName: "状态", status: true },
  { field: "planStatus", headerName: "计划状态", status: {
    S1B: { label: "待复核", color: "danger" },
    S1C: { label: "已完成", color: "success" },
    special: { label: "特殊处理", color: "#8b5cf6" }
  } }
];

status 复用主题标签,支持 success/warning/danger/info/neutral 及 CSS 颜色;未知代码保持中性,0/false 保留。formatter 的文字可参与默认语义匹配;显式 renderer 优先。状态配置只控制展示,导出继续遵循原有列值政策。

普通布局尊重显式 width 和拖动后的宽度;autoWidth: false 保留原默认 150px。显式选择 columnLayout: "fit" 时仍按首选宽度比例铺满,360px 限制的是内容首选宽度,实际铺满仍遵循显式 minWidth/maxWidth;配置 flex 则主动允许本列吸收余量。手动调宽、列状态恢复及主动 columns.fit() 不受自动默认上限限制。更新数据或刷新单元格会重新测量,普通布局刷新复用结果。

表头默认完整展示,不省略。初始布局、fit、列宽恢复、API、鼠标和 Alt+方向键统一以完整标题及排序/筛选/列工具控件为最小宽度;显式 width/minWidth/maxWidth 不能把标题压窄,空间不足时表格内部横向滚动。360px 上限仅作用于数据内容的首选宽度,不截断表头。复杂自定义表头请显式提供 minWidth。

原生单元格按钮、链接、输入控件及 contenteditable 保留自身键盘和剪贴板行为;Enter/空格可直接激活详情等操作,Ctrl/Cmd 快捷键不会误触发表格编辑或修改表格数据。

版本与发布记录

@agile-team/mach-table-react 共发布 35 个版本,首次发布于 2026/08/28;过去 12 个月发布了 35 个版本。

版本发布日期距今
0.39.0latest2026/11/061 天前
0.38.02026/11/052 天前
0.37.02026/11/025 天前
0.36.02026/11/016 天前
0.35.32026/11/017 天前
0.35.22026/10/318 天前

关于 @agile-team/mach-table-react 的常见问题

@agile-team/mach-table-react 是什么?

Machtable 企业数据网格的官方反应 18+适配器

如何安装 @agile-team/mach-table-react?

在项目目录运行 npm install @agile-team/mach-table-react,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(>=18.0.0)、react-dom(>=18.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@agile-team/mach-table-react 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@agile-team/mach-table-react 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@agile-team/mach-table-react 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=18.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@agile-team/mach-table-react 可以商用吗?

@agile-team/mach-table-react 使用 SEE LICENSE IN LICENSE 许可。许可条款写在包内的独立文件中,请阅读该文件确认可否商用。以上为概括,不构成法律意见,请以许可原文为准。

@agile-team/mach-table-react 的下载量有多少?

根据 npm 官方下载统计,@agile-team/mach-table-react 在 2026/10/05 – 2026/11/03 这 30 天内被下载 2,712 次,日均约 90 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@agile-team/mach-table-react 还在维护吗?

最新版本 0.39.0 发布于 2026/11/06(1 天前);至今共发布 35 个版本,其中过去 12 个月发布了 35 个;首次发布于 2026/08/28。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。