Skip to content

MarkdownRenderer

核心渲染组件,将 Markdown 字符串转换为 VNode 树,<vue-block> 占位元素被替换为真实 Vue 组件。

用法

vue
<script setup lang="ts">
import { MarkdownRenderer } from '@krishanjinbo/vue-markdown-stream'
</script>

<template>
  <MarkdownRenderer :content="markdownString" @agent:action="handleAction" />
</template>

Props

属性类型默认值说明
contentstring必填Markdown 字符串,支持流式追加
componentsComponentMap{}自定义组件注册表(与内置组件合并,用户组件优先)
propsSchemasRecord<string, ComponentPropsSchema>{}自定义 Props Schema(与默认 Schema 合并)
enableValidationbooleantrue是否启用 Props 安全校验

Events

事件载荷类型说明
agent:actionAgentActionPayload任何内置或自定义块组件触发的用户交互事件

渲染流程

content
  → autoCloseContainers(content)     处理流式未闭合块
  → md.render(completedMarkdown)     markdown-it 输出 HTML(含 <vue-block>)
  → DOMParser.parseFromString(html)  HTML → DOM 树
  → validateProps(name, rawProps)     Props 白名单校验 + 类型转换
  → domNodeToVNode(node)             递归转为 h() VNode + 事件绑定
  → AgentEventBus                    组件事件 → @agent:action
  → h('div.markdown-body', vnodes)   最终输出

内置组件注册表

组件名块语法
AlertBlock:::alert
DataCard:::card
ConfirmBlock:::confirm
SelectBlock:::select
FormBlock:::form
ProgressBlock:::progress
DataTableBlock:::datatable
ActionPills:::actions

样式

输出根元素带 markdown-body class。引入内置样式:

typescript
import '@krishanjinbo/vue-markdown-stream/style.css'

Released under the MIT License.