好用的 Markdown 编辑器组件

news/2024/9/17 18:05:43/ 标签: 编辑器, javascript, 前端

ByteMD

bytedance/bytemd: ByteMD v1 repository (github.com)

这里由于我的项目是 Next,所以安装 @bytemd/react, 阅读官方文档,执行命令来安装编辑器主体、以及 gfm(表格支持)插件、highlight 代码高亮插件:

npm i @bytemd/react
npm i @bytemd/plugin-highlight @bytemd/plugin-gfm

但是浏览器的样式不好看,我们可以引入第三方主题:
github-markdown-css

npm install github-markdown-css
import 'github-markdown-css/github-markdown-light.css';

然后使用组件:

src/components/MdEditor/index.tsx

import { Editor } from "@bytemd/react";
import gfm from "@bytemd/plugin-gfm";
import highlight from "@bytemd/plugin-highlight";
import 'github-markdown-css/github-markdown-light.css';
import "bytemd/dist/index.css";
import "highlight.js/styles/vs.css";
import "./index.css";interface Props {value?: string;onChange?: (v: string) => void;placeholder?: string;
}const plugins = [gfm(), highlight()];/*** Markdown 编辑器* @param props* @constructor*/
const MdEditor = (props: Props) => {const { value = "", onChange, placeholder } = props;return (<div className="md-editor"><Editorvalue={value || ""}placeholder={placeholder}mode="split"plugins={plugins}onChange={onChange}/></div>);
};export default MdEditor;

把 MdEditor 当前输入的值暴露给父组件,便于父组件去使用,同时也是提高组件的通用性,所以定义了属性和属性类型,把 value 和 onChange 事件交给父组件去管理。

src/components/MdEditor/index.css

.md-editor {.bytemd-toolbar-icon.bytemd-tippy.bytemd-tippy-right:last-child {display: none;}
}

隐藏编辑器中不需要的操作图标(像 GitHub 图标)

编辑好文本,自然有浏览文本的地方,所以浏览器:

src/components/MdViewer/index.tsx

import { Viewer } from "@bytemd/react";
import gfm from "@bytemd/plugin-gfm";
import highlight from "@bytemd/plugin-highlight";
import 'github-markdown-css/github-markdown-light.css';
import "bytemd/dist/index.css";
import "highlight.js/styles/vs.css";
import "./index.css";interface Props {value?: string;
}const plugins = [gfm(), highlight()];/*** Markdown 浏览器* @param props* @constructor*/
const MdViewer = (props: Props) => {const { value = "" } = props;return (<div className="md-viewer"><Viewer value={value} plugins={plugins} /></div>);
};export default MdViewer;

src/components/MdViewer/index.css

.md-viewer {.bytemd-toolbar-icon.bytemd-tippy.bytemd-tippy-right:last-child {display: none;}
}

可以在任意客户端渲染页面(或组件)引入组件进行测试,这是因为该组件用到了 useRef 之类的仅客户端才支持的函数。

const [text, setText] = useState<string>('');<MdEditor value={text} onChange={setText} />
<MdViewer value={text} />

md-editor-v3

文本编辑器/md-editor-v3 (gitee.com)

这个是之前写 Vue3 用过的一个编辑器,也很不错,用法简单,同样支持 Vue、React 等。

安装

yarn add md-editor-v3

更多使用及贡献方式参考:md-editor-extension

编辑器模式

<template><MdEditor v-model="text" />
</template><script setup>
import { ref } from 'vue';
import { MdEditor } from 'md-editor-v3';
import 'md-editor-v3/lib/style.css';const text = ref('# Hello Editor');
</script>

仅预览模式

<template><MdPreview :editorId="id" :modelValue="text" /><MdCatalog :editorId="id" :scrollElement="scrollElement" />
</template><script setup>
import { ref } from 'vue';
import { MdPreview, MdCatalog } from 'md-editor-v3';
import 'md-editor-v3/lib/preview.css';const id = 'preview-only';
const text = ref('# Hello Editor');
const scrollElement = document.documentElement;
</script>

http://www.ppmy.cn/news/1524906.html

相关文章

Nacos1.X中对NacosNamingService的实现

NacosNamingService Nacos Client包中的NamingService实现类为NacosNamingService&#xff0c;通过封装好的SDK供用户使用&#xff0c;来调用nacos对外暴露的OpenAPI SDK方式只是提供了一种访问的封装&#xff0c;在底层仍然是基于HTTP协议完成请求的。 NamingService提供了…

CleanClip for mac(苹果电脑剪切板管理器)

CleanClip 是一款为 Mac 设计的强大剪贴板管理工具&#xff0c;它能够显著提升你的工作效率和生产力。无论是在日常办公中还是进行创意设计&#xff0c;CleanClip 都能帮助你更轻松地管理和使用剪贴板内容。让我们一起来探索一下这个功能丰富的软件吧&#xff01; 下载地址&am…

快手视频怎么去水印保存到手机?

在这个信息爆炸的时代&#xff0c;短视频已成为我们日常生活中不可或缺的一部分。而作为国内知名的短视频平台&#xff0c;快手凭借其庞大的用户群体和海量的优质内容&#xff0c;成为了很多人娱乐、学习甚至工作的主要来源。但是有时候&#xff0c;我们会发现&#xff0c;想要…

Minio笔记-Centos搭建Minio

下载 Minio wget https://dl.min.io/server/minio/release/linux-amd64/minio 赋予执行权限 chmod x minio 创建存储目录 mkdir /data 运行 Minio ./minio server /data 默认端口为9000 访问 Minio 控制台&#xff1a;在浏览器中输入 http://your-server-ip:9000 默认…

通过 Sniper Links 提高您的电子邮件确认率

通过使用狙击链接重定向用户到只显示确认邮件的收件箱搜索&#xff0c;GrowthDesign 将他们的邮件确认率提高了 12%&#xff0c;从而增加了数千个已完成的注册。 目录 简要概述营销策略是什么&#xff1f;结果如何&#xff1f;如何实施为什么有效&#xff1f;获取更多类似策略…

App结合3D形象的技术实现选择

在为App添加3D人物交互效果时&#xff0c;可以采用多种技术&#xff0c;具体选择取决于你的目标平台&#xff08;iOS、Android、跨平台&#xff09;以及项目的复杂性和需求。 以下是几种常用技术及其特点&#xff1a; 游戏引擎技术 游戏引擎提供了强大的3D图形渲染和交互功能&…

LeetCode之滑动窗口

209. 长度最小的子数组 class Solution {// 方法 minSubArrayLen 接收一个整数 s 和一个整数数组 nums// 返回和大于或等于 s 的最小子数组长度public int minSubArrayLen(int s, int[] nums) {int n nums.length; // 获取数组的长度// 如果数组为空&#xff0c;直接返回 0if…

【机器人建模和控制】读书笔记

机器人建模和控制——马克斯庞 A. x 1 0 x 1 ∙ x 0 x^0_1x_1\bullet x_0 x10​x1​∙x0​&#xff0c;其实就是&#xff1a; 1&#xff09; x 1 x_1 x1​轴向量在 O 0 O_0 O0​系下的坐标 2&#xff09;在 x 0 x_0 x0​轴上的投影 3&#xff09;坐标变换矩阵的 R 1 0 R_1…

redis的 stream数据类型实现 消息队列?

redis的 stream数据类型实现 消息队列&#xff1f; redis的消息队列可以通过&#xff1a; PUB/SUB&#xff0c;订阅/发布模式&#xff1a;缺点是发布订阅模式是无法持久化的&#xff0c;如果出现网络断开、Redis 宕机等&#xff0c;消息就会被丢弃&#xff1b; 使用列表 List…

大模型微调:RHLF与DPO浅析

大模型应用性能的提升不仅在于其预训练&#xff0c;而微调的作用也非常显著。对于多数从事大模型应用领域的团队而言&#xff0c;微调是一个核心的工作之一&#xff0c;为专门任务完善大模型并确保其产出符合我们的预期。 1. 关于微调 微调涉及调整预训练的LLM &#xff0c;以更…

50projects50days案例代码分析学习、效果,Html+CSS+JavaScript小案例

案例来源于&#xff1a;https://github.com/bradtraversy/50projects50days&#xff0c;部分资源需要科学上网加载使用&#xff0c;往后不再赘述。 合集链接&#xff0c;欢迎订阅&#xff1a; https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzkwODY2OTA5NA&actiongetal…

ai智能语电销机器人有哪些功能?

近几年火爆的AI语音机器人&#xff0c;已经可以成熟的服务于金融贷款、理财、房地产、电商、汽车等行业&#xff0c;成熟的适用于电话销售、客服服务、售后管理等等基础岗位&#xff0c;那么ai智能语电销机器人有哪些功能&#xff1f;我们来看一看。 顾名思义&#xff0c;智能…

数据结构 栈 队列

系统栈&#xff1a; 保护局部变量 函数的形参和返回值 函数的调用关系&#xff08;保护现场&#xff0c;恢复现场操作&#xff0c;遵循先进后出&#xff0c;后进先出&#xff09; 数据结构栈&#xff08;顺序栈&#xff0c;链式栈&#xff09;&#xff1a; 同样遵遵循先进…

Linux操作系统入门(一)

Linux操作系统是开源的类Unix操作系统内核&#xff0c;由林纳斯托瓦兹在1991年创建。 Linux操作系统以其强大的性能、稳定性和开放性&#xff0c;赢得了全球用户的广泛认可&#xff0c;从服务器到个人电脑&#xff0c;从超级计算机到嵌入式设备&#xff0c;都有它的身影。作为…

vue如何做到计算属性传参?

1.计算属性传参&#xff0c;还在return一个函数&#xff1f; let nameFull computed(() > {return e > {console.log(参数, e)} }) 那这样的话&#xff0c;干脆直接写一个函数 2.真正的计算属性传参&#xff0c;借助map实现 import { computed } from "vue&quo…

手把手教你给服务器安装及使用ESXI系统

ESXi&#xff08;以前称为 ESX Server&#xff09;是由 VMware 开发的一款企业级的裸机虚拟化管理程序&#xff08;hypervisor&#xff09;。ESXi 允许直接在物理硬件上运行&#xff0c;并在其上创建和管理多个虚拟机&#xff08;VMs&#xff09;&#xff0c;每个虚拟机都可以运…

Python酷库之旅-第三方库Pandas(116)

目录 一、用法精讲 511、pandas.DataFrame.std方法 511-1、语法 511-2、参数 511-3、功能 511-4、返回值 511-5、说明 511-6、用法 511-6-1、数据准备 511-6-2、代码示例 511-6-3、结果输出 512、pandas.DataFrame.var方法 512-1、语法 512-2、参数 512-3、功能…

Element UI入门笔记(个人向)

Element UI入门笔记 将页面分割为一级菜单、二级菜单、导航栏三个部分&#xff1b;使用npm下载安装&#xff0c;使用语句npm i element-ui -s; 布局组件 el-form 用于创建和管理表单&#xff1b;从属性上看&#xff1a; :model&#xff1a;用于双向数据绑定&#xff0c;将表单…

3C电子胶黏剂在手机制造方面有哪些关键的应用

3C电子胶黏剂在手机制造方面有哪些关键的应用 3C电子胶黏剂在手机制造中扮演着至关重要的角色&#xff0c;其应用广泛且细致&#xff0c;覆盖了手机内部组件的多个层面&#xff0c;确保了设备的可靠性和性能。以下是电子胶在手机制造中的关键应用&#xff1a; 手机主板用胶&…

Android Framework(五)WMS-窗口显示流程——窗口布局与绘制显示

文章目录 relayoutWindow流程概览应用端处理——ViewRootImpl::setView -> relayoutWindowViewRootImpl::setViewViewRootImpl::performTraversalsViewRootImpl::relayoutWindow Surface的创建WindowManagerService::relayoutWindow了解容器类型和Buff类型的SurfaceBuff类型…