编辑器 活跃维护

mui-rte

niuware/mui-rte

Material-UI 富文本编辑器和查看器

449
Stars 标星
155
Forks 分支
6
Watchers 关注
100
Open Issues
TypeScript
主要语言
MIT
开源协议
657 KB
仓库大小
2 年前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:niuware/mui-rte
git clone https://github.com/niuware/mui-rte.git
git clone git@github.com:niuware/mui-rte.git
README.md master

英文原文正文为项目原始 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 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。