MarkdownEditor

工具栏 + 源码框 + 实时预览的分栏 Markdown 编辑器。

最后更新

说明

Value 存的是 Markdown 源码而非 HTML,落库、比对、二次编辑都按纯文本处理。预览交给框架内的 MarkdownRenderer 纯托管解析(先整体转义再替换标记,javascript: 之类可执行协议与危险的 data: 一律拦下),前端不引第三方 Markdown 库。View 取 edit / split / preview,右上角另有全屏。工具栏改写选区、Ctrl+B / Ctrl+I / Ctrl+K、列表回车续写与 Tab 缩进都由 known.editor 在 DOM 上完成,改完补发一次原生 input 事件,因此 @bind-Value 拿到的始终是最新源码。图片不自带上传通道:给了 ImageUpload 委托就弹文件选择框、把返回的地址写进 ,没给则退化为插入链接模板——存对象存储还是本地磁盘由宿主决定。

常见能力:

  • 三态视图与全屏
  • 工具栏与快捷键
  • 纯托管渲染零依赖
  • 协议白名单防 XSS
  • 图片上传交宿主
  • 字数行数统计

用法

<MarkdownEditor @bind-Value="@doc" @bind-View="@view" Height="320px" />

// 图片交给宿主保存,返回的地址直接写进 ![]()
<MarkdownEditor @bind-Value="@doc" View="edit" ImageUpload="SaveImage" MaxImageSize="2097152" />

async Task<string> SaveImage(IBrowserFile file)
{
    var url = await oss.PutAsync(file);
    UI.Success($"{file.Name} 已插入");
    return url;
}

API 参数

参数 类型 默认值 说明
Accept string "image/png,image/jpeg,image/gif,image/webp" 文件选择框的 accept,默认常见四种图片格式。
Height string "260px" 编辑区高度,如 260px;全屏时忽略本值改为撑满视口。
Id string null 编辑区 textarea 的 id,留空自动生成。
ImageUpload Func<IBrowserFile, Task<string>> null 图片上传委托:收到选中的文件,返回能直接写进 的地址。 未提供时「图片」按钮退化为插入 说明 模板,不弹文件选择框。
MaxImageSize Int64 5242880 单张图片大小上限(字节),0 表示不限制;超限直接提示、不进委托。
Placeholder string null 输入框占位提示。
ReadOnly bool false 只读:仍可切换预览,但工具栏置灰、快捷键失效。
ShowFooter bool true 是否显示底部字数 / 行数统计。
ShowToolbar bool true 是否显示顶部工具栏。
Value string null 绑定的 Markdown 源码。
ValueChanged EventCallback<string> — 事件 源码变化后的回调,工具栏与快捷键的改动同样会走到这里。
View string "split" 视图模式:edit 仅编辑 / split 左源码右预览 / preview 仅预览,默认分栏。
ViewChanged EventCallback<string> — 事件 视图模式变化回调,配合 @bind-View。
Visible bool true 取得或设置组件是否可见,默认为false。
VisibleChanged EventCallback<bool> — 事件 取得或设置组件可见性变化时的回调事件。
Class string null 取得或设置组件的CSS类名,用于自定义样式。
Disabled bool false 取得或设置组件是否禁用,默认为false。
Style string null 取得或设置组件的内联样式,用于自定义样式。

所有组件均继承 BaseComponent,除上表参数外还支持 Class、Style、Disabled、Visible。

微信公众号二维码 扫码关注公众号
QQ 交流群二维码 扫码加入 QQ 群