英文原文正文为项目原始 README(英文),本站后续会翻译为中文,当前仅剔除图片与无关章节并统一排版。
mui-rte
Material-UI 富文本编辑器和查看器
mui-rte 是一个完整的 MUI 库(原 Material-UI)文本编辑器和查看器,基于 draft-js 并使用 Typescript 编写。它开箱即用,同时支持用户定义的块、样式、自动完成策略、异步/同步自定义原子块、回调和装饰器,以及工具栏和主题自定义,以满足所有编辑需求。
安装
npm install mui-rte --save
安装对等依赖:@mui/material、@mui/icons-material、@mui/styles、react 和 react-dom。你还需要安装 MUI 的对等依赖:@emotion/react 和 @emotion/styled。
演示
使用
import { createTheme, ThemeProvider } from '@mui/material/styles'
import MUIRichTextEditor from 'mui-rte'
const myTheme = createTheme({
// Set up your custom MUI theme here
})
ReactDOM.render(
<ThemeProvider theme={myTheme}>
<MUIRichTextEditor label="Start typing..." />
</ThemeProvider>,
document.getElementById("root")
)
您可以按如下示例加载默认内容。该值应为字符串化的 RawDraftContentState 对象:
import MUIRichTextEditor from 'mui-rte'
const data = getContentStateAsStringFromSomewhere()
ReactDOM.render(
<ThemeProvider theme={myTheme}>
<MUIRichTextEditor
defaultValue={data}
label="Start typing..."
/>
</ThemeProvider>,
document.getElementById("root")
)
Material-UI v4 Compatibility
mui-rte 版本 2.x 仅兼容 MUI (v5)。您仍然可以使用适用于 Material-UI v4 的 1.x 版本。当前使用 mui-rte 版本 1.x 的代码应该与版本 2.x 兼容,唯一的破坏性更改是它要求像示例中那样被 ThemeProvider 包裹。
示例
请查看 examples 目录以获取更多信息。
自定义控件
您可以为编辑器定义自定义的内联样式、区块、原子区块和回调操作。只需从 @mui/icons-material 中选择一个图标,或创建您自己的 FunctionComponent 并定义您的规则。
添加自定义内联样式
此示例添加了一个控件,用于更改输入或选中文本的背景颜色和字体颜色:
import MUIRichTextEditor from 'mui-rte'
import InvertColorsIcon from '@mui/icons-material/InvertColors'
<MUIRichTextEditor
controls={["my-style"]}
customControls={[
{
name: "my-style",
icon: <InvertColorsIcon />,
type: "inline",
inlineStyle: {
backgroundColor: "black",
color: "white"
}
}
]}
/>
添加自定义块
此示例根据 React Element 向编辑器添加一个区块:
import MUIRichTextEditor from 'mui-rte'
import TableChartIcon from '@mui/icons-material/TableChart'
const MyBlock = (props) => {
return (
<div style={{
padding: 10,
backgroundColor: "#ebebeb"
}}>
My Block content is:
{props.children}
</div>
)
}
<MUIRichTextEditor
controls={["my-block"]}
customControls={[
{
name: "my-block",
icon: <TableChartIcon />,
type: "block",
blockWrapper: <MyBlock />
}
]}
/>
添加自定义原子块(异步)
可以使用 insertAtomicBlockAsync API 插入基于异步行为的自定义块。上面的示例展示了一个示例,说明如何上传图片并使用 MUIRichTextEditor 的默认图片控件进行进一步编辑。你可以使用这种行为,在编辑器中拖放文件时上传文件,并在上传后将其渲染为图片实体。
查看这个其他示例,展示了如何使用异步下载内容添加 @mui/material Card 组件。
添加自定义原子块(同步)
查看这个示例,展示了如何创建一个控件,将 @mui/material Card 组件添加到编辑器中。
添加自定义回调控件
此示例添加了一个控件,该控件将触发自定义回调函数以清除编辑器状态:
import MUIRichTextEditor from 'mui-rte'
import DoneIcon from '@mui/icons-material/Done'
import { EditorState } from 'draft-js'
<MUIRichTextEditor
controls={["my-callback"]}
customControls={[
{
name: "my-callback",
icon: <DoneIcon />,
type: "callback",
onClick: (editorState, name, anchor) => {
console.log(`Clicked ${name} control`)
return EditorState.createEmpty()
}
}
]}
/>
自动完成策略
您可以定义自动完成策略,根据文本输入显示建议内容列表。只需设置触发字符,添加一些搜索键和要插入的内容,编辑器就会为您完成所有操作。您可以使用键盘箭头导航建议,最后按“回车”将内容插入编辑器。
简单策略示例
这是一个示例,展示当用户开始输入类似 ':face'、':joy' 或 ':grin' 的文本时,如何显示表情符号建议:
import MUIRichTextEditor from 'mui-rte'
const emojis = [
{
keys: ["face", "grin"],
value: "😀",
content: "😀",
},
{
keys: ["face", "joy"],
value: "😂",
content: "😂",
},
{
keys: ["face", "sweat"],
value: "😅",
content: "😅",
}
]
<MUIRichTextEditor
autocomplete={{
strategies: [
{
items: emojis,
triggerChar: ":"
}
]
}}
/>
查看此示例,展示了如何在单个编辑器中添加多种自动完成策略。
原子策略示例
查看此示例,展示了如何将原子自定义控件与自动完成策略功能结合使用。
自定义装饰器
您可以定义自定义装饰器,根据提供的正则表达式应用样式和/或功能。
使用装饰器添加自定义功能
要在用户输入 #hashtag 时添加一些功能,请使用以下示例。在这种情况下,每次用户输入以 # 字符开头的单词时,它都会自动转换为带样式的链接:
import MUIRichTextEditor from 'mui-rte'
const MyHashTagDecorator = (props) => {
const hashtagUrl = "http://myurl/" + props.decoratedText
return (
<a
href={hashtagUrl}
style={{
color: "green"
}}
>
{props.children}
</a>
)
}
<MUIRichTextEditor
label="Type something here..."
decorators={[
{
component: MyHashTagDecorator,
regex: /\#[\w]+/g
}
]}
/>
内联工具栏
编辑器包含一个内联工具栏选项,当用户进行选择时,会在编辑器区域内显示弹出窗口。内联工具栏支持用户定义的控件。请注意,只有 inline 类型的控件会被渲染。主工具栏显示的控件可以与内联工具栏中的控件不同。你也可以隐藏主工具栏,只启用内联工具栏。
import MUIRichTextEditor from 'mui-rte'
<MUIRichTextEditor
label="Type something here..."
inlineToolbar={true}
/>
编辑器样式
你可以使用 Material-UI 的主题功能来为编辑器设置样式。首先使用 createMuiTheme 创建一个主题,然后覆盖诸如 root、container、editor 和 editorContainer 的类。更多内容请查看 examples 目录。
import { createMuiTheme, MuiThemeProvider } from '@mui/material/styles'
import MUIRichTextEditor from 'mui-rte'
const defaultTheme = createMuiTheme()
Object.assign(defaultTheme, {
overrides: {
MUIRichTextEditor: {
root: {
marginTop: 20,
width: "80%"
},
editor: {
borderBottom: "1px solid gray"
}
}
}
})
<MuiThemeProvider theme={defaultTheme}>
<MUIRichTextEditor
label="Type something here..."
/>
</MuiThemeProvider>
应用程序编程接口
<MUIRichTextEditor /> (TMUIRichTextEditorProps)
| 属性 | 类型 | 描述 | |
|---|---|---|---|
| id | string |
可选 | 组件 HTML 元素的基础 Id 名称。 |
| ref | TMUIRichTextEditorRef |
可选 | 设置编辑器组件的引用实例。 |
| 标签 | string |
可选 | 内容为空时显示的字符串。 |
| readOnly | boolean |
可选 | 只读模式。工具栏默认禁用。 |
| value | string |
已弃用 | 请改用 defaultValue。 |
| defaultValue | string |
可选 | 默认加载的内容。应为字符串化的 Draft.Model.Encoding.RawDraftContentState 对象。 |
| inheritFontSize | boolean |
可选 | 从父级继承字体大小。适用于只读模式。 |
| error | boolean |
可选 | 以错误样式渲染编辑器。 |
| controls | string[] |
可选 | 要在主工具栏中显示的控件列表。如果未提供,将渲染所有控件。当前可用值为:"title"、"bold"、"italic"、"underline"、"strikethrough"、"highlight"、"undo"、"redo"、"link"、"media"、"numberList"、"bulletList"、"quote"、"code"、"clear"、"save"。 |
| customControls | TCustomControl[] |
可选 | 定义用户自定义内联样式、块和回调的数组。更多信息请参见下方“自定义控件”。 |
| decorators | TDecorator[] |
可选 | 定义用户自定义装饰器数组。更多信息请参见“自定义装饰器”。 |
| toolbar | boolean |
可选 | 定义是否渲染主工具栏。 |
| toolbarButtonSize | small | medium |
可选 | 设置主工具栏默认 IconButton 组件的大小。 |
| inlineToolbar | boolean |
可选 | 定义是否渲染内联工具栏。 |
| inlineToolbarControls | string[] |
可选 | 要在内联工具栏中显示的控件列表。可用值为:"bold"、"italic"、"underline"、"strikethrough"、"highlight"、"link"、"clear"以及用户自定义内联控件。如果未提供且 inlineToolbar 为 true,将显示以下内联样式:粗体、斜体、下划线和清除。 |
| keyCommands | TKeyCommand[] |
可选 | 定义用于为编辑器添加快捷键的 TKeyCommand 对象数组。 |
| draftEditorProps | TDraftEditorProps |
可选 | 定义包含特定 draft-js Editor 属性的对象。 |
| maxLength | number |
可选 | 设置可以输入到编辑器中的最大字符数。 |
| autocomplete | TAutocomplete |
可选 | 设置自动完成策略,以在用户输入时显示建议列表。 |
| onSave | (data:string) => void |
可选 | 按下保存按钮时触发的函数。data 是一个字符串化的 Draft.Model.Encoding.RawDraftContentState 对象。 |
| onChange | (state: EditorState) => void |
可选 | 在编辑器发生任何更改(按键输入、删除等)时触发的函数。state 是一个 Draft.Model.ImmutableData.EditorState 对象。 |
| onFocus | () => void |
可选 | 当编辑器获得焦点时触发的函数。 |
| onBlur | () => void |
可选 | 当编辑器失去焦点时触发的函数。 |
TCustomControl
| 属性 | 类型 | 描述 | |
|---|---|---|---|
| id | string |
可选 | 控件的 HTML id 属性 |
| name | string |
必填 | 自定义控件的名称。为了渲染该控件,应将此名称添加到 MUIRichTextEditor 的 controls 属性中。 |
| 图标 | JSX.Element |
可选 | 控件的 @mui/icons-material 图标。对于“原子”控件类型,图标不是必需的。查看此处获取可用图标。 |
| 组件 | React.FunctionComponent<TToolbarComponentProps> |
可选 | 控件的自定义函数组件。图标优先于组件,因此如果设置了图标,组件将被忽略。对于“原子”控件类型,组件不是必需的。 |
| 类型 | string |
必填 | 可以是 “inline”、“block”、“atomic” 或 “callback” |
| inlineStyle | string |
可选 | 在使用自定义内联样式时,用于设置文本样式的 React.CSSProperties 对象。 |
| blockWrapper | React.ReactElement |
可选 | 用于渲染自定义区块的自定义 React 组件。 |
| atomicComponent | React.FunctionComponent |
可选 | 用于渲染自定义原子块的自定义 React FunctionComponent。 |
| onClick | (editorState: EditorState, name: string, anchor: HTMLElement \| null) => EditorState \| void |
可选 | 当自定义控件被点击时触发的回调函数。接收的参数包括当前的 EditorState 对象、被点击控件的名称以及引发点击的 HTMLElement。如果返回一个新的 EditorState 对象,它将替换编辑器中的当前对象(对显式修改 EditorState 很有用)。 |
TToolbarComponentProps
| 属性 | 类型 | 描述 |
|---|---|---|
| id | string |
组件的ID。 |
| onMouseDown | (e: React.MouseEvent) => void |
mousedown 事件处理程序。 |
| active | boolean |
定义当前编辑器选择的块级或行内类型是否处于激活状态。 |
| disabled | boolean |
设置工具栏是否禁用。 |
TDecorator
| 属性 | 类型 | 描述 | |
|---|---|---|---|
| 组件 | React.FunctionComponent |
必填 | 用于渲染装饰器的 React 组件。 |
| 正则表达式 | RegExp |
必填 | 用于匹配装饰器的正则表达式。 |
TKeyCommand
| 属性 | 类型 | 描述 | |
|---|---|---|---|
| key | number |
必填 | 要绑定的键的代码。 |
| name | string |
必填 | 命令的名称。 |
| callback | (state: EditorState) => EditorState |
必填 | 当键绑定匹配时要执行的回调函数。它应返回要设置的 EditorState。 |
TDraftEditorProps
| 属性 | 类型 | 描述 | |
|---|---|---|---|
| spellCheck | boolean |
可选 | 使用浏览器拼写检查。 |
| stripPastedStyles | boolean |
可选 | 在将文本粘贴到编辑器时移除样式。 |
| handleDroppedFiles | (selectionState: SelectionState, files: Blob[]) => DraftHandleValue |
可选 | 处理拖入编辑器的文件。DraftHandleValue 可以是 handled 或 not-handled。 |
TAutocomplete
| 属性 | 类型 | 描述 | |
|---|---|---|---|
| 策略 | TAutocompleteStrategy[] |
必填 | 自动完成策略数组。 |
| 建议限制 | number |
可选 | 定义向用户展示的建议数量。默认值为 5。 |
TAutocompleteStrategy
| 属性 | 类型 | 描述 | |
|---|---|---|---|
| triggerChar | string |
必填 | 触发自动完成策略的单个字符。 |
| items | TAutocompleteItem[] |
必填 | 自动完成建议项列表。 |
| insertSpaceAfter | boolean |
可选 | 如果为 false,在将内容插入编辑器后不会添加空格。默认值为 true。 |
| atomicBlockName | string |
可选 | 使用 atomic 自定义控件类型将内容添加到编辑器。 |
TAutocompleteItem
| 属性 | 类型 | 描述 | |
|---|---|---|---|
| keys | string[] |
必填 | 用户需要输入以显示此项目建议的键列表。 |
| value | any |
必填 | 当选择该项目时要插入到编辑器中的值。 |
| content | string \| JSX.Element |
必填 | 此条目在自动完成建议列表中显示的内容。请注意,此内容在 ListItem 组件下呈现。 |
TMUIRichTextEditorRef
| 属性 | 类型 | 描述 | |
|---|---|---|---|
| focus | () => void |
触发编辑器的焦点事件。 | |
| save | () => void |
触发编辑器的保存方法。 | |
| insertAtomicBlock | (name: string, data: any) |
已弃用 | 请改用 insertAtomicBlockSync。 |
| insertAtomicBlockSync | (name: string, data: any) |
在编辑器中插入一个名为 name(如果存在)的原子块,并提供 data。 |
|
| insertAtomicBlockAsync | (name: string, promise: Promise<TAsyncAtomicBlockResponse>, placeholder?: string) => void |
异步在编辑器中插入一个名为 name(如果存在)的原子块,并提供 data。在 promise 解析之前,编辑器中会显示 placeholder 文本。 |
TAsyncAtomicBlockResponse
| 属性 | 类型 | 描述 | |
|---|---|---|---|
| 数据 | any |
必需 | 分配给添加到编辑器中的实体的数据。 |
更新日志
查看 版本说明 以获取更新日志。
开发
用于开发:
$ npm run build
$ npm run serve
未来计划
- 添加测试覆盖
- 重构代码
- 添加新功能
建议和问题
请随时在 Issues 标签页上留下您的评论。
许可证
根据 MIT 许可证获得授权。
- 本文标题:mui-rte - Material-UI 富文本编辑器和查看器
- 本文链接:https://www.cn121.com/editor/niuware-mui-rte.html
- 原项目:niuware/mui-rte 版权归原作者 niuware 及贡献者所有
- 收录信息:本站于 2026-10-10 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
- 开源协议:收录时本项目采用 MIT(查看 LICENSE 原文),本站转载其原始文档(未改动文字,仅剔除图片与无关章节);使用、修改、分发请以该仓库 LICENSE 原文为准。
- 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 niuware/mui-rte。
- 内容说明:本页正文为原项目 README 原文(英文),本站后续会翻译为中文(当前尚未译出,仅将二级标题译为中文,便于按栏目定位;标题原文可在下方原仓库中查看),仅剔除了图片与赞助等无关章节、并把相对链接改为绝对地址;页首简介为机器翻译自仓库描述。
- 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
- 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。