Skip to content

API

包导出

ts
import RichTextEditor, {
  RichTextEditor as NamedRichTextEditor,
  RichTextOutline,
  OfficeIcon,
  OfficeColorIcon,
  ScrollArea,
  monoIconNames,
  colorIconNames,
} from '@norio-office/rich-text'

组件 Props

Prop类型默认值说明
modelValueJSONContent | nullnull编辑器内容,支持 v-model
documentNamestring''内置导出下载的文件名基础名;组件会自动追加 .pdf.png.html
editablebooleantrue是否允许编辑。
mode'edit' | 'preview''edit'编辑模式或预览模式。
watermarkRichTextEditorWatermarkOptions | nullnull文档页面文本水印配置;不传或 text 为空时不显示。
showOutlinebooleantrue是否显示编辑器内置大纲。设为 false 后可以配合外部 RichTextOutline 组件自行放置目录。
outlinePlacement'left' | 'right''right'大纲面板位置。
messagesRichTextEditorMessages | nullnull覆盖内置 UI 文案。
enabledExportItemsRichTextEditorExportItemKey[] | nullnull导出菜单白名单。
enabledInsertMenuItemsRichTextEditorInsertMenuItemKey[] | nullnull插入菜单白名单。
enabledToolbarActionsRichTextEditorToolbarActionKey[] | nullnull工具栏能力白名单。
placeholderstring''空内容占位文案。
mentionbooleanfalse是否启用 @ 提及功能。
collaborationRichTextEditorCollaborationOptions | nullnullYjs 协同配置。
uploadImageRichTextEditorUploadHook | nullnull内置图片选择、图片块上传时调用。
uploadVideoRichTextEditorUploadHook | nullnull内置视频选择、视频块上传时调用。
uploadFileRichTextEditorUploadHook | nullnull本地文件选择器上传时调用。
onUploadErrorRichTextEditorUploadErrorHandler | nullnull上传失败回调;同时也会触发 upload-error 事件。
mentionProviderRichTextEditorMentionProvider | nullnull@ 提及候选数据提供函数,兼容用法。
onMentionSearchRichTextEditorMentionProvider | nullnull@mention-search 函数式事件对应的异步候选加载函数。

白名单 props 不传时表示启用全部内置项;传入数组后,仅数组里的项目会显示并可用。

协同配置

ts
interface RichTextEditorCollaborationUser {
  name: string
  color: string
  userId?: string
  clientUniqueCode?: string
  [key: string]: unknown
}

interface RichTextEditorCollaborationOptions {
  document: RichTextEditorCollaborationDocument
  field?: string
  provider?: RichTextEditorCollaborationProvider | null
  user?: RichTextEditorCollaborationUser | null
  initializeContent?: boolean
  initialContent?: JSONContent | null
}
字段说明
document外部创建的 Y.Doc
fieldYjs fragment 名称,同一房间内所有客户端必须一致,普通场景固定用 content
provider外部协同 provider,例如 y-websocket。传入后可显示远程光标和选区。
user当前用户信息;同一用户多窗口时 clientUniqueCode 必须不同。
initializeContent是否由当前客户端把 initialContent 写入空协同 fragment。只有全新空房间且当前客户端拥有初始化权时才传 true
initialContent初始化内容。后端已有 Yjs 快照时不要传初始化内容。

统一协同服务接入时,富文本的 documentType 使用 rich,不要使用预留给未来 Word 组件的 word

水印配置

ts
type RichTextEditorWatermarkOptions = {
  text: string
  color?: string
  fontSize?: number
  rotate?: number
  showInEdit?: boolean
}
字段类型默认值说明
textstring-水印文字,必填。
colorstring'rgba(15, 23, 42, 0.12)'水印文字颜色。
fontSizenumber18水印字号,单位 px。
rotatenumber-24水印倾斜角度,单位 deg。
showInEditbooleantrue编辑状态下是否显示水印;预览状态始终按配置显示。

可用 Key

导出菜单:

ts
type RichTextEditorExportItemKey = 'pdf' | 'html' | 'image' | 'print'

插入菜单:

ts
type RichTextEditorInsertMenuItemKey =
  | 'image'
  | 'video'
  | 'table'
  | 'local-file'
  | 'columns'
  | 'highlight-block'
  | 'date'
  | 'code-block'
  | 'formula'
  | 'blockquote'
  | 'emoji'
  | 'link'
  | 'divider'
  | 'countdown'
  | 'markdown-import'

工具栏:

ts
type RichTextEditorToolbarActionKey = 'blockquote'

事件

事件Payload说明
update:modelValueJSONContent内容更新,用于 v-model
changeJSONContent内容更新事件。
local-file-uploadRichTextEditorLocalFilePayload用户通过本地文件选择器插入文件后触发。
local-file-clickRichTextEditorLocalFilePayload用户点击本地文件卡片非下载按钮区域时触发。
local-file-downloadRichTextEditorLocalFilePayload用户点击本地文件卡片下载按钮时触发。
upload-errorRichTextEditorUploadErrorPayload图片、视频或文件上传 hook 失败时触发。
mention-searchRichTextEditorMentionProviderPayload函数式监听写法,对应 onMentionSearch prop;输入 @ 后加载候选数据,可返回数组或 Promise
mention-item-clickRichTextEditorMentionItem点击弹窗候选项或已插入的提及节点时触发。
mention-submitRichTextEditorMentionItem点击弹窗“提及”按钮并插入提及节点后触发。

mention-search 没有出现在组件的 defineEmits 中;Vue 模板里的 @mention-search="handler" 会作为 onMentionSearch 函数式 prop 传入组件。

实例 API

通过 Vue ref 获取组件实例方法:

vue
<script setup lang="ts">
import { ref } from 'vue'
import { RichTextEditor } from '@norio-office/rich-text'
import type { RichTextEditorInstance } from '@norio-office/rich-text'

const editorRef = ref<RichTextEditorInstance | null>(null)
</script>

<template>
  <RichTextEditor ref="editorRef" />
</template>
方法返回值说明
exportPdf()Promise<Blob | null>导出 PDF。
exportImage(options?)Promise<Blob | null>导出图片,支持 PNG/JPEG。
exportHtml()string | null导出 HTML 字符串。
insertImage(payload)boolean插入 1 到 4 张图片。
insertVideo(payload)boolean插入视频块。
insertFile(payload)boolean插入链接/文件预览块。
insertLocalFile(payload)boolean插入本地文件卡片。
insertMention(payload)boolean插入一个结构化行内提及节点;mention 未开启时返回 false
openLocalFilePicker()void打开本地文件选择器。
focus()void聚焦编辑器。
getJSON()JSONContent | null获取当前 JSON 内容。
getText()string获取当前纯文本内容,不包含 HTML 标签。
getImages()RichTextEditorImagePayload[]获取文档内所有图片信息。
getVideos()RichTextEditorVideoPayload[]获取文档内所有视频信息。
getFiles()RichTextEditorCollectedFilePayload[]获取文档内所有文件信息;kind: 'file' 表示链接/文件预览块,kind: 'local-file' 表示本地文件卡片。
getOutlineItems()RichTextEditorOutlineItem[]获取当前目录项。
getActiveOutlinePos()number | null获取当前激活目录项的文档位置。
focusOutlineItem(pos)boolean聚焦并跳转到指定目录项。
onOutlineChange(handler)() => void监听目录变化,返回取消监听函数。

外置目录组件

内置目录默认跟随编辑器一起渲染。如果需要把目录放到任意侧栏、抽屉或自定义布局里,可以关闭内置目录,并把编辑器实例传给 RichTextOutline

vue
<script setup lang="ts">
import { ref } from 'vue'
import { RichTextEditor, RichTextOutline } from '@norio-office/rich-text'
import type { RichTextEditorInstance } from '@norio-office/rich-text'

const editorRef = ref<RichTextEditorInstance | null>(null)
</script>

<template>
  <RichTextEditor ref="editorRef" v-model="content" :show-outline="false" />
  <aside class="outline-sidebar">
    <RichTextOutline :editor="editorRef" />
  </aside>
</template>

RichTextOutline 会自动订阅编辑器目录状态,点击条目时会调用 focusOutlineItem 跳转到对应标题。组件自身最小高度为 200px,默认根据内容自适应增高;如果需要固定高度或内部滚动,请在外层套一个容器控制高度。

可选 props:openplacementtitlecollapseTitleemptyDescriptionemptyTipshowCollapse

事件:selecttogglechange

自定义文案

编辑器默认 UI 文案为中文。可以用 messages 覆盖任意 key:

vue
<RichTextEditor
  v-model="content"
  :messages="{
    'insert.localFile': '附件',
    'export.label': '下载',
  }"
/>

常用文案 key:

Key默认中文
insert.label插入
insert.section.general通用
insert.section.apps小应用
insert.section.external外部内容
insert.image图片
insert.video视频
insert.table表格
insert.localFile本地文件
insert.columns分栏
insert.highlightBlock高亮块
insert.date日期
insert.codeBlock代码块
insert.formula公式
insert.blockquote引用
insert.emoji表情符号
insert.link超链接
insert.divider分隔线
insert.countdown倒计时
insert.markdownImportMarkdown 导入
export.label导出
export.pdf导出 PDF
export.pdf.loading导出 PDF 中...
export.html导出 HTML
export.html.loading导出 HTML 中...
export.image导出图片
export.image.loading导出图片中...
print.label打印
print.loading打印中...
quote.apply应用引用
quote.cancel取消引用
quote.borderColor边框颜色
quote.backgroundColor背景颜色
outline.label大纲
outline.collapse收起大纲
outline.empty.description对文档内容应用“标题”样式,即可自动生成大纲。
outline.empty.tip点击左下角“大纲”按钮可以随时展开或收起。
status.wordCountUnit个字
status.presentation.enter演示
status.presentation.exit退出演示
status.fullscreen.enter全屏
status.fullscreen.exit退出全屏
countdown.selectTime请选择时间
countdown.settingsTitle倒计时设置
formula.insertTitle插入 LaTeX 公式

类型导入

ts
import type {
  OfficeColorIconProps,
  OfficeIconProps,
  RichTextEditorAlign,
  RichTextEditorCollaborationAwareness,
  RichTextEditorCollaborationDocument,
  RichTextEditorCollaborationProvider,
  RichTextEditorCollaborationUser,
  RichTextEditorCollaborationOptions,
  RichTextEditorCollectedFilePayload,
  RichTextEditorExportItemKey,
  RichTextEditorFilePayload,
  RichTextEditorImageExportOptions,
  RichTextEditorImagePayload,
  RichTextEditorInsertMenuItemKey,
  RichTextEditorInstance,
  RichTextEditorLocalFilePayload,
  RichTextEditorMentionItem,
  RichTextEditorMentionProvider,
  RichTextEditorMentionProviderPayload,
  RichTextEditorMentionType,
  RichTextEditorMessages,
  RichTextEditorOutlineChangeHandler,
  RichTextEditorOutlineItem,
  RichTextEditorOutlineState,
  RichTextEditorProps,
  RichTextEditorToolbarActionKey,
  RichTextEditorUploadErrorHandler,
  RichTextEditorUploadErrorPayload,
  RichTextEditorUploadHook,
  RichTextEditorUploadInput,
  RichTextEditorUploadKind,
  RichTextEditorUploadResult,
  RichTextEditorWatermarkOptions,
  RichTextEditorVideoPayload,
} from '@norio-office/rich-text'

Built with VitePress