import { MarkdownPlugin, AnchorItem } from '../components/RenderMarkdown/utils/render-markdown'; /** * 属性名:标记"由 JS 动态插入、需跨增量渲染保留"的节点。 * 带此属性的节点在 morphdom diff 时不会被移除(如插件容器内 JS 插入的收起按钮)。 */ export declare const MD_PERSIST_ATTR = "data-md-persist"; interface UseIncrementalRenderOptions { /** Markdown 内容 */ content: string; /** 代码类型包装 */ codeType?: string; /** 自定义 markdown-it 插件 */ customRenderers?: MarkdownPlugin[]; /** morphdom patch 节流时间(ms),默认 16(~60fps) */ throttleMs?: number; /** * 节点被 morphdom diff 移除后触发(含被移除子树的递归子节点)。 * 用于清理挂在被移除节点上的 React Root、监听器等状态。 */ onNodeDiscarded?: (el: HTMLElement) => void; } /** * 增量渲染 hook,使用 morphdom 进行部分 DOM 更新。 * * - 首次渲染:使用 innerHTML 设置初始内容 * - 后续渲染:渲染为字符串,然后通过 morphdom patch 容器 * - 节流 patch 调用,避免流式输出期间过多 DOM 操作 * - 渲染序号保证内容变化后,飞行中的渲染结果不会污染新状态 * - 按"标签 + className"语义 key 匹配节点,保护 customRenderers(插件)产出的容器状态 * - 保留节点上 JS 添加的 data-* 属性(初始化守卫位),避免 patch 后被重复初始化 * - 返回 inner 内容
的 ref 回调 */ export declare function useIncrementalRender({ content, codeType, customRenderers, throttleMs, onNodeDiscarded, }: UseIncrementalRenderOptions): { anchors: AnchorItem[]; hasContent: boolean; setInnerRef: (node: HTMLDivElement | null) => void; }; export default useIncrementalRender;