功能特性
- 支持创建和编辑具有高级行为的表格
- 箭头键导航(上/下)
- 网格单元格选择
- 使用
Shift+箭头键
扩展单元格选择范围 - 单元格复制粘贴功能
- 行拖拽重新排序
- 通过拖拽手柄选择整行
套件使用指南
安装
最快捷的表格功能集成方式是使用 TableKit
,它包含预配置的 TablePlugin
、TableRowPlugin
、TableCellPlugin
和 TableCellHeaderPlugin
及其 Plate UI 组件。
TableElement
: 渲染表格容器TableRowElement
: 渲染表格行TableCellElement
: 渲染表格单元格TableCellHeaderElement
: 渲染表头单元格
添加套件
将套件添加到插件列表:
import { createPlateEditor } from 'platejs/react';
import { TableKit } from '@/components/editor/plugins/table-kit';
const editor = createPlateEditor({
plugins: [
// ...其他插件
...TableKit,
],
});
手动配置
安装
pnpm add @platejs/table
添加插件
在创建编辑器时将 TablePlugin
加入插件数组:
import { TablePlugin } from '@platejs/table/react';
import { createPlateEditor } from 'platejs/react';
const editor = createPlateEditor({
plugins: [
// ...其他插件
TablePlugin,
],
});
插件配置
使用自定义组件和选项配置表格插件:
import {
TableCellHeaderPlugin,
TableCellPlugin,
TablePlugin,
TableRowPlugin,
} from '@platejs/table/react';
import { createPlateEditor } from 'platejs/react';
import {
TableCellElement,
TableCellHeaderElement,
TableElement,
TableRowElement,
} from '@/components/ui/table-node';
const editor = createPlateEditor({
plugins: [
// ...其他插件
TablePlugin.configure({
node: { component: TableElement },
options: {
initialTableWidth: 600,
disableMerge: false,
minColumnWidth: 48,
},
}),
TableRowPlugin.withComponent(TableRowElement),
TableCellPlugin.withComponent(TableCellElement),
TableCellHeaderPlugin.withComponent(TableCellHeaderElement),
],
});
node.component
: 指定TableElement
渲染表格容器withComponent
: 为表格行、单元格和表头单元格分配组件options.initialTableWidth
: 设置新建表格的初始宽度options.disableMerge
: 禁用单元格合并功能options.minColumnWidth
: 设置表格列的最小宽度
添加工具栏按钮
可以在工具栏中添加 TableToolbarButton
来插入表格。
插入工具栏按钮
将此条目添加到插入工具栏按钮以插入表格元素:
{
icon: <TableIcon />,
label: '表格',
value: KEYS.table,
}
禁用合并示例
插件说明
TablePlugin
disableMerge optional boolean
禁用单元格合并行为
disableExpandOnInsert optional boolean
禁用插入单元格时的表格扩展
disableMarginLeft optional boolean
禁用表格第一列的左侧调整手柄
enableUnsetSingleColSize optional boolean
禁用当表格只有一列时取消设置第一列宽度。设置为
true
可在单列情况下调整表格宽度,保持false
可实现全宽表格initialTableWidth optional number
若定义此值,标准化器会将每个未定义的表格
colSizes
设置为该值除以列数(注意:暂不支持合并单元格)minColumnWidth optional number
表格列的最小宽度
- 默认值:
48
- 默认值:
TableRowPlugin
表格行插件
TableCellPlugin
表格单元格插件
TableCellHeaderPlugin
表头单元格插件
API 参考
editor.api.create.table
editor.api.create.tableCell
创建表格的空单元格节点
editor.api.create.tableRow
创建具有指定列数的空行节点
editor.api.table.getCellBorders
获取表格单元格的边框样式,处理首行和首列单元格的特殊情况
editor.api.table.getCellChildren
获取表格单元格的子元素
editor.api.table.getCellSize
获取表格单元格的宽度和最小高度,考虑列跨度和列宽设置
editor.api.table.getColSpan
获取表格单元格的列跨度
editor.api.table.getRowSpan
获取表格单元格的行跨度
getCellType
获取插件单元格类型
getNextTableCell
获取表格中的下一个单元格
getPreviousTableCell
获取表格中的上一个单元格
getTableColumnCount
获取表格列数
getTableColumnIndex
获取单元格在表格中的列索引
getTableEntries
根据当前选区或指定位置获取表格、行和单元格的节点 entry
getTableGridAbove
根据指定格式(表格或单元格)获取锚点和焦点位置上方的子表格
getTableGridByRange
获取指定范围内两个单元格路径之间的子表格
getTableRowIndex
获取单元格在表格中的行索引
getTopTableCell
获取表格中当前单元格上方的单元格
isTableBorderHidden
检查表格单元格或表格本身的指定方向边框是否隐藏
转换操作
tf.insert.table
在当前选区插入表格(若编辑器中无现有表格)。选中插入表格的起始位置。
tf.insert.tableColumn
在表格的当前选区或指定单元格路径处插入一列。
tf.insert.tableRow
在表格的当前选区或指定行路径处插入一行。
tf.remove.tableColumn
删除表格中包含选中单元格的列。
tf.remove.tableRow
删除表格中包含选中单元格的行。
tf.remove.table
删除整个表格。
tf.table.merge
将多个选中的单元格合并为一个。
合并后的单元格将:
- 列跨度等于所选单元格跨越的列数
- 行跨度等于所选单元格跨越的行数
- 包含所有合并单元格的组合内容(仅非空单元格)
- 继承第一个选中单元格的表头状态
tf.table.split
将合并的单元格拆分回单独的单元格。
拆分操作将:
- 为每个跨越的列和行创建新单元格
- 从原始合并单元格复制表头状态
- 将原始单元格的内容放在第一个单元格中
- 为剩余空间创建空单元格
tf.moveSelectionFromCell
在表格内按单元格单位移动选区。
tf.setBorderSize
设置表格单元格中指定边框的大小。
tf.setTableColSize
设置表格中特定列的宽度。
tf.setTableMarginLeft
设置表格的左边距。
tf.setTableRowSize
设置表格行的大小(高度)。
插件扩展
onKeyDownTable
处理表格的键盘事件。
withDeleteTable
防止删除表格中的单元格。
withGetFragmentTable
如果选区在表格内,它会获取选区上方的子表格作为片段。这在复制和粘贴表格单元格时很有用。
withInsertFragmentTable
如果插入表格:
- 如果选区锚点上方的块是表格,则用插入的表格替换上方的每个单元格,直到超出边界。选中插入的单元格。
- 如果锚点上方没有表格,检查选区是否在表格内。如果是,找到锚点位置的单元格并用插入的片段替换其子元素。
withInsertTextTable
如果选区已展开:
- 检查选区是否在表格内。如果是,将选区折叠到焦点边缘。
withNormalizeTable
通过执行以下操作规范化表格结构:
- 如果单元格子元素是文本,则将其包装在段落中。
- 解包不是有效表格元素的节点。
- 如果指定了初始列大小,则为表格设置初始列大小。
withSelectionTable
通过执行以下操作处理表格选区:
- 当锚点在表格内且焦点在表格前后的块中时,调整选区的焦点。
- 当焦点在表格内且锚点在表格前后的块中时,调整选区的焦点。
- 如果前一个和新选区在不同的单元格中,则覆盖从单元格的选区。
withSetFragmentDataTable
通过执行以下操作处理复制或剪切表格数据时设置剪贴板数据:
- 检查是否存在表格条目和选中的单元格条目。
- 通过复制单元格内容而不是表格结构来处理单单元格复制或剪切操作。
- 创建包含选中单元格内容的表格结构。
- 将文本、HTML、CSV、TSV 和 Slate 片段数据设置到剪贴板。
withTable
通过应用以下高阶函数增强编辑器实例的表格相关功能:
withNormalizeTable
:规范化表格结构和内容。withDeleteTable
:防止删除表格中的单元格。withGetFragmentTable
:处理复制或剪切表格单元格时获取片段数据。withInsertFragmentTable
:处理插入表格片段。withInsertTextTable
:处理在表格中插入文本。withSelectionTable
:处理调整表格内的选区。withSetFragmentDataTable
:处理复制或剪切表格数据时设置片段数据。
Hooks
useTableCellElementResizable
提供表格单元格元素调整大小功能的 hook。
useTableStore
表格存储存储表格插件的状态。
useIsCellSelected
检查表格单元格是否被选中的自定义 hook。
useSelectedCells
管理表格中单元格选择的 hook。
它跟踪当前选中的单元格,并根据编辑器选择的变化更新它们。
useTableBordersDropdownMenuContentState
表格边框下拉菜单内容的状态 hook。
hasBottomBorder boolean
指示选中的表格单元格是否有底部边框。
hasTopBorder boolean
指示选中的表格单元格是否有顶部边框。
hasLeftBorder boolean
指示选中的表格单元格是否有左侧边框。
hasRightBorder boolean
指示选中的表格单元格是否有右侧边框。
hasNoBorders boolean
指示选中的表格单元格是否没有边框。
hasOuterBorders boolean
指示选中的表格单元格是否有外部边框(即所有边都有边框)。
getOnSelectTableBorder function
返回特定边框类型的
onSelectTableBorder
处理程序的工厂函数。onSelectTableBorder
处理程序负责为选中的表格单元格设置边框样式。
一个具有以下属性的对象:
useTableColSizes
返回应用了覆盖的表格列大小的自定义 hook。如果表格的 colCount
更新为 1 且启用了 enableUnsetSingleColSize
选项,它将取消设置 colSizes
节点。
useTableElement
处理单元格选择和左边距计算的表格元素 hook。
useTableCellElement
为表格单元格提供状态和功能的表格单元格元素 hook。
useTableCellBorders
返回表格单元格边框样式的 hook。
useTableCellSize
返回表格单元格大小(宽度和最小高度)的 hook。
On This Page
功能特性套件使用指南安装添加套件手动配置安装添加插件插件配置添加工具栏按钮插入工具栏按钮禁用合并示例插件说明TablePluginTableRowPluginTableCellPluginTableCellHeaderPluginAPI 参考editor.api.create.tableeditor.api.create.tableCelleditor.api.create.tableRoweditor.api.table.getCellBorderseditor.api.table.getCellChildreneditor.api.table.getCellSizeeditor.api.table.getColSpaneditor.api.table.getRowSpangetCellTypegetNextTableCellgetPreviousTableCellgetTableColumnCountgetTableColumnIndexgetTableEntriesgetTableGridAbovegetTableGridByRangegetTableRowIndexgetTopTableCellisTableBorderHidden转换操作tf.insert.table
tf.insert.tableColumn
tf.insert.tableRow
tf.remove.tableColumn
tf.remove.tableRow
tf.remove.table
tf.table.merge
tf.table.split
tf.moveSelectionFromCell
tf.setBorderSize
tf.setTableColSize
tf.setTableMarginLeft
tf.setTableRowSize
插件扩展onKeyDownTable
withDeleteTable
withGetFragmentTable
withInsertFragmentTable
withInsertTextTable
withNormalizeTable
withSelectionTable
withSetFragmentDataTable
withTable
HooksuseTableCellElementResizable
useTableStore
useIsCellSelected
useSelectedCells
useTableBordersDropdownMenuContentState
useTableColSizes
useTableElement
useTableCellElement
useTableCellBorders
useTableCellSize