当前位置: 首页 > web >正文

【React 插件】@uiw/react-md-editor 使用教程:从基础使用到自定义扩展

1.背景

  • @uiw/react-md-editor 是一款基于 React 和 TypeScript 的轻量级 Markdown 编辑器插件。
  • 它支持实时预览、GitHub 风味 Markdown 语法、暗黑模式、工具栏自定义等核心功能,同时提供丰富的扩展接口(如自定义命令、插件集成)。
  • 其基于 textarea 的封装设计,不依赖 CodeMirror/Monaco 等重型编辑器,性能优异且易于集成,专为现代 Web 应用设计。
  • 本文将从基础安装到高级配置,详细介绍其核心用法与优化技巧。

2.快速安装

安装依赖通过 npm 或 yarn、pnpm 安装核心包:

npm install @uiw/react-md-editor
# 或
pnpm add @uiw/react-md-editor
# 或
yarn add @uiw/react-md-editor

3.基础使用

3.1 基础组件示例。

import { useState } from 'react';
import MDEditor from '@uiw/react-md-editor';const textSample = `# 欢迎使用 Markdown 编辑器!
这是 **React Markdown Editor** 的一个示例。
## ✨ 功能
- 实时预览
- 支持自定义样式
- 代码高亮
- 自动聚焦到文本末尾## 📦 示例代码\`\`\`javascript
function hello() {console.log("Hello, world!");
}
\`\`\`
`;function App() {const [value, setValue] = useState<string>(textSample);return (<MDEditorvalue={value}onChange={(val) => setValue(val ?? '')}height={800}/>);
}export default App;

关键参数:

  • value:绑定 Markdown 文本内容。
  • onChange:监听文本变化并更新状态

效果
在这里插入图片描述

  • 左侧编辑区输入 Markdown,右侧实时预览渲染后的 HTML。
  • 支持快捷键(如 Ctrl+B 加粗、Ctrl+I 斜体)。

4.核心功能详解

4.1 实时预览与模式切换

默认行为:编辑器自动分栏显示编辑区和预览区。

禁用预览:通过 preview="edit" 强制显示单栏编辑模式。

import { useState } from 'react';
import MDEditor from '@uiw/react-md-editor';function App() {const [value, setValue] = useState<string>('hello world');return (<MDEditorvalue={value}onChange={(val) => setValue(val ?? '')}height={800}preview="edit"/>) 
};

纯预览模式:使用 <MDEditor.Markdown source={value} /> 单独渲染 Markdown

import { useState } from 'react';
import MDEditor from '@uiw/react-md-editor';function App() {const [value, setValue] = useState<string>('hello world');return (<MDEditor.Markdown source={value} />) 
};

4.2 自定义工具栏

通过 commandsextraCommands 扩展或隐藏工具栏按钮:

ps:

  • 如果需要隐藏 commands 与 extraCommands 功能, 可以把对应的值是设置为[]
  • eg: commands={[]}
import { getCommands, getExtraCommands } from '@uiw/react-md-editor/commands-cn';<MDEditorcommands={[...getCommands()]} // 基础命令(加粗、斜体等)extraCommands={[...getExtraCommands()]} // 扩展命令(表格、任务列表等)
/>

4.3 自定义命令

实现 customCommand 接口添加按钮:

import { getCommands, getExtraCommands } from '@uiw/react-md-editor/commands-cn';
import type { ICommand, TextState, TextAreaTextApi } from '@uiw/react-md-editor';
import MDEditor from '@uiw/react-md-editor';const customCommand: ICommand = {name: 'title3',keyCommand: 'title3',buttonProps: { 'aria-label': '插入 H3 标题' },icon: (<svg width="12" height="12" viewBox="0 0 20 20" fill="none"><path d="M3 4v12M3 10h8M11 4v12M17 8v4M15 10h4" stroke="currentColor" strokeWidth="1.2"/></svg>),execute: (_: TextState, api: TextAreaTextApi) => {api.replaceSelection('### 自定义标题\n');},
};function App() {const [value, setValue] = useState<string>(textSample);return (<div><MDEditorvalue={value}onChange={(val) => setValue(val ?? '')}height={800}commands={[customCommand]}/></div>);
}

4.2 性能优化

禁用滚动同步:当 enableScroll={true} 时,编辑区与预览区滚动同步可能导致卡顿,建议默认关闭:

<MDEditor enableScroll={false} />

虚拟滚动:处理长文档时,可结合 react-windowreact-virtualized 实现虚拟滚动,减少 DOM 节点。

4.3 样式定制

通过 CSS 类名破坏性覆盖默认样式:

<MDEditor className="my-editor" />
.my-editor .w-md-editor-text-pre > code {font-size: 16px;line-height: 1.5;
}

4.4 主题切换

data-color-mode参数:

  • light 默认值
  • dark
<MDEditor data-color-mode="dark" />

5.总结

@uiw/react-md-editor 以轻量、易用为核心优势,通过灵活的配置可满足从简单文档编辑到复杂知识管理系统的需求。

5.1 适用场景

  1. 博客系统
    支持富文本内容创作,兼容技术文档的代码块和语法高亮。
  2. 知识管理系统
    提供结构化文档编辑能力,支持表格、列表等复杂格式。
  3. 在线教育平台
    暗黑模式和实时预览适合长时间写作,工具栏自定义可适配教学场景。
  4. Next.js 项目
    官方提供 Next.js 集成示例,支持服务端渲染(SSR)环境。

5.2 优势与局限

  • 优势
    • 轻量级:无外部编辑器依赖,打包体积小。
    • 易用性:开箱即用,文档完善,适合快速集成。
    • 灵活性:支持自定义工具栏、快捷键和样式,适应多样化需求。
  • 局限
    • 功能精简:相比 Monaco Editor 等重型编辑器,缺少高级功能(如自动补全、多光标编辑)。
    • 样式覆盖需谨慎:部分 CSS 属性需通过 !important 强制覆盖,可能影响维护性。

5.3 生态与支持

  • 社区活跃
    GitHub 仓库获 2.5k+ Star,持续更新版本(最新 v4.0.8),修复问题并新增功能(如行操作、国际化)。
  • 扩展性
    支持通过插件机制扩展 Markdown 语法(如数学公式、流程图),需结合 rehyperemark 生态库。

5.4 推荐理由

@uiw/react-md-editor 是 React 生态中兼顾性能与功能的优质选择,尤其适合以下场景:

  • 需要快速集成 Markdown 编辑器的中小型项目。
  • 追求低依赖、高定制化的开发者。
  • 希望减少学习成本,直接使用 TypeScript 类型安全的团队。

若项目需要更复杂的功能(如协作编辑、AI 辅助写作),可考虑基于该组件二次开发或选择更重型的专业编辑器。

6 参考

官网文档链接

http://www.xdnf.cn/news/17266.html

相关文章:

  • 【自动驾驶】《Sparse4Dv3 Advancing End-to-End 3D Detection and Tracking》论文阅读笔记
  • [科普] 从单核到千核:Linux SMP 的“演化史”与工程细节
  • MySQL数据库索引及底层数据结构
  • 16-DS18B20-±0.5℃精度-12bitADC--55°C ~ +125°C
  • 如何测试一个机器是大端还是小端
  • 如何解决网页视频课程进度条禁止拖动?
  • 查看ubuntu server 的基本信息
  • ubuntu 22.04 中安装python3.11 和 3.11 的 pip
  • 自然语言处理的相关概念与问题
  • 如何给小语种视频生成字幕?我的实测方法分享
  • 从《中国开源年度报告》看中国开源力量的十年变迁中,Apache SeaTunnel 的跃迁
  • Numpy科学计算与数据分析:Numpy入门之多平台安装与基础环境配置
  • 学习 Android(十四)NDK基础
  • RocketMQ和Kafka一样有重平衡的问题吗?
  • 人工智能-python-机器学习实战:特征降维、PCA与KNN的核心价值解析
  • LlaMA_Factory实战微调VL大模型
  • o2o 商城系统数据分析管理系统模块设计
  • SpringMVC基础
  • Linux部署tp5.1,nginx服务器不管访问那个方法,一直访问index/index问题解决方法
  • 【YOLOv8改进 - C2f融合】C2f融合EBlock(Encoder Block):低光增强编码器块,利用傅里叶信息增强图像的低光条件
  • 环保监测新范式:边缘计算网关如何为河长制赋能增效?
  • Java面试宝典:Java内存模型与对象可达性判定原理
  • NWinfo(硬件信息检测工具)v1.4.20绿色免费版,U盘随走随检,结果即刻导出
  • ⭐CVPR 文本到 3D 场景生成新突破:Prometheus 框架解析
  • 贪心算法学习 跳跃游戏
  • app-3
  • 实习文档背诵
  • 2.1.4 砌体材料的性能与应用
  • SG105 Pro 网管交换机的3种VLAN配置
  • 强化应急通信生命线:遨游三防平板、卫星电话破局极端灾害救援