拆分视图
本页是 createSplitView 和 SplitView 实例的 API 参考。
如果你是分屏视图的新手,请先阅读 分屏视图指南。
createSplitView
创建一个分屏视图实例,将三个编辑器连接在一起以并排审查更改。
在 AI Toolkit 实例上调用:
const toolkit = getAiToolkit(mainEditor)
const splitView = toolkit.createSplitView(options)参数
options(CreateSplitViewOptions): 分屏视图的配置leftEditor(Editor): 左侧面板编辑器(显示原始文档)。必须安装AiToolkit。rightEditor(Editor): 右侧面板编辑器(显示修改后的文档)。必须安装AiToolkit。leftContainer?(HTMLElement): 左侧面板的滚动容器。当与rightContainer一起提供时,启用自动滚动同步。rightContainer?(HTMLElement): 右侧面板的滚动容器。当与leftContainer一起提供时,启用自动滚动同步。diffOptions?(SplitViewDiffOptions): 内部 diff 算法的选项mode?('smart' | 'inline' | 'block'): Diff 算法模式。默认为'smart'。groupInlineChanges?(number): 将内联更改分组为块级更改的阈值。默认为0。
返回值 (SplitView)
返回一个 SplitView 实例。参见下方的 SplitView 方法 部分。
示例
import { getAiToolkit } from '@tiptap-pro/ai-toolkit'
const splitView = getAiToolkit(mainEditor).createSplitView({
leftEditor,
rightEditor,
leftContainer: leftScrollRef.current,
rightContainer: rightScrollRef.current,
})SplitView 方法
sync
根据主编辑器的跟踪更改重新计算 diff,并更新两个面板。将 before/after 快照加载到左侧和右侧编辑器中,然后渲染高亮装饰和占位符。
每当主编辑器的跟踪更改发生变化时调用此方法(例如在应用新的 AI 建议后)。
splitView.sync()getEntries
返回上一次 sync() 调用计算的当前 diff 条目列表。
const entries = splitView.getEntries()
// SplitDiffEntry[]参见 SplitDiffEntry 了解每个条目的形状。
acceptEntry
通过将其底层的跟踪更改应用到主编辑器来接受单个 diff 条目,然后重新同步。
const accepted = splitView.acceptEntry('diff-tc-abc123')
// 如果未找到条目则返回 falserejectEntry
通过在主编辑器中还原其底层的跟踪更改来拒绝单个 diff 条目,然后重新同步。
const rejected = splitView.rejectEntry('diff-tc-abc123')
// 如果未找到条目则返回 falseacceptAll
一次性接受所有剩余的跟踪更改,然后重新同步。
splitView.acceptAll()rejectAll
一次性拒绝所有剩余的跟踪更改,然后重新同步。
splitView.rejectAll()setHighlight
设置用于跨编辑器悬停高亮的 diff 条目 ID。当悬停 data-diff-id 元素时,内置的悬停监听器会自动调用此方法。仅当你实现自定义悬停逻辑时才使用此方法。
splitView.setHighlight('diff-tc-abc123') // 高亮一个条目
splitView.setHighlight(null) // 清除高亮on / off
注册或移除事件监听器。
const handler = (entries) => {
// entries: SplitDiffEntry[]
console.log(`${entries.length} diff entries remaining`)
}
splitView.on('sync', handler)
splitView.off('sync', handler)当前支持的事件:
| 事件 | 负载 | 描述 |
|---|---|---|
sync | SplitDiffEntry[] | 每次同步后触发,附带更新后的条目列表 |
destroy
销毁实例:取消任何待处理的动画帧,清除两个编辑器中的所有装饰,并移除所有事件监听器。
splitView.destroy()当不再需要分屏视图时,始终调用 destroy()(例如在组件卸载时)。
SplitDiffEntry
getEntries() 返回的列表中的每个条目具有以下形状:
interface SplitDiffEntry {
/** 唯一标识符,例如 `"diff-tc-abc123"` */
id: string
/** 此更改在左侧(原始)文档中的范围 */
rangeInBefore: { from: number; to: number }
/** 此更改在右侧(修改后)文档中的范围 */
rangeInAfter: { from: number; to: number }
/** 构成此 diff 条目的跟踪更改的 ID */
trackedChangeIds: string[]
/** 更改类型 */
type?: 'add' | 'delete' | 'replace'
}CSS 装饰类
分屏视图将以下 CSS 类应用于编辑器 DOM。你必须在自己的样式表中定义这些类的样式。
| 类 | 应用于 | 描述 |
|---|---|---|
split-diff-deletion | 左侧编辑器 | 高亮被删除或修改的块 |
split-diff-insertion | 右侧编辑器 | 高亮被添加或修改的块 |
split-diff-highlight | 两个编辑器 | 与当前悬停条目的删除/插入一起添加 |
split-diff-spacer | 两个编辑器 | 维持面板之间垂直对齐的 widget 元素 |
所有装饰元素都包含一个设置为条目 ID 的 data-diff-id 属性,你可以用于自定义点击和悬停处理。
不要覆盖占位符边距
分屏视图通过内联样式在每个占位符元素上设置 margin: 0。在 CSS 中覆盖此设置会破坏垂直对齐,因为占位符高度已经包含了包括周围块边距在内的完整视觉间隙。