react项目中自定义一个markdown编辑器

这篇具有很好参考价值的文章主要介绍了react项目中自定义一个markdown编辑器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

react项目中自定义一个markdown编辑器

Markdown 是一种轻量级标记语言。

Markdown是一种简单的格式化文本的方法,在任何设备上看起来都很棒。它不会做任何花哨的事情,比如改变字体大小、颜色或类型——只是基本的,使用你已经知道的键盘符号。

它还允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者HTML)文档。

这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。

由于 Markdown 的轻量化、易读易写特性,并且对于图片图表数学公式都有支持,许多网站都广泛使用 Markdown 来撰写帮助文档或是用于论坛上发表消息。

那么在react中,我们如何使用markdown编辑器来写开发文档?查阅资料及实践后,最终形成以下方案,记录下来以供参阅。

插件依赖及目录

依赖插件:

  • 编辑器使用 for-editor,
  • 内容预览及展示采用 react-markdown。
  • 数学公式支持及语法解析使用 remark-math、rehype-katex,数学公式的样式展示需要 katex.min.css 文件支持,见下文。
  • 引入 rehype-raw 解析HTML文本(因为可能仍需解析之前输入的富文本内容)。

依赖安装

yarn add for-editor react-markdown remark-math  rehype-katex rehype-raw 

package.json:组件涉及的依赖及版本

"dependencies": {
    "for-editor": "^0.3.5",  // Markdown编辑
    "react-markdown": "^8.0.6", // Markdown预览
    "rehype-katex": "^6.0.2", // 数学公式katex语法
    "rehype-raw": "^6.1.1", // 支持HTML语法解析
    "remark-math": "^5.1.1", // 支持数学公式
}

目录结构

├─components
    |── MarkdownEditor
        ├─ Index.js 
        └─ MarkdownPreview.js

相关代码及说明

Index.js:编辑器的主体代码

for-editor 是一个基于 react 的 markdown 语法编辑器

for-editor官网地址:https://www.npmjs.com/package/for-editor

Api

属性

name type default description
value String - 输入框内容
placeholder String 开始编辑… 占位文本
lineNum Boolean true 是否显示行号
style Object - 编辑器样式
height String 600px 编辑器高度
preview Boolean false 预览模式
expand Boolean false 全屏模式
subfield Boolean false 双栏模式(预览模式激活下有效)
language String zh-CN 语言(支持 zh-CN:中文简体, en:英文)
toolbar Object 如下 自定义工具栏
*
  默认工具栏按钮全部开启, 传入自定义对象
  例如: {
    h1: true, // h1
    code: true, // 代码块
    preview: true, // 预览
  }
  此时, 仅仅显示此三个功能键
  注:传入空对象则不显示工具栏
 */
 
toolbar: {
  h1: true, // h1
  h2: true, // h2
  h3: true, // h3
  h4: true, // h4
  img: true, // 图片
  link: true, // 链接
  code: true, // 代码块
  preview: true, // 预览
  expand: true, // 全屏
  /* v0.0.9 */
  undo: true, // 撤销
  redo: true, // 重做
  save: true, // 保存
  /* v0.2.3 */
  subfield: true, // 单双栏模式
}

事件

name params 参数 default description
onChange String: value - 内容改变时回调
onSave String: value - 保存时回调
addImg File: file - 添加图片时回调

图片上传

export default function MarkdownEditor({ value, onChangeContext, readOnly }) {  
  // 上传图片
  const addImg = (_file) => {
    console.log(_file)
    mdRef.current.$img2Url(_file.name, 'file_url');
  };

  return (
    <div style={{position: "relative"}}> 
        <ForEditor
        placeholder="请输入Markdown文本" 
        addImg={_file => addImg(_file)}
        /> 
    </div>
  );
}

Index.js完整代码如下:

import React, { Fragment, useRef, useState } from "react";
import { Button, Modal } from "antd";
import ForEditor from "for-editor";
import MdPreview from "../MarkdownEditor/MarkdownPreview";
 
/** https://github.com/kkfor/for-editor
 * @param {string} value Markdown文本内容
 * @param {() => void} onChange 更改内容方法
 * @param {boolean} readOnly 只读状态
 */

export default function MarkdownEditor({ value, onChangeContext, readOnly }) {
  const [visible, setVisible] = useState(false); // 预览弹框状态
  const mdRef = useRef(null); // 编辑器ref

  // 工具栏菜单
  const toolbar = {
    h1: true, // h1
    h2: true, // h2
    h3: true, // h3
    h4: true, // h4
    img: true, // 图片
    link: true, // 链接
    code: true, // 代码块
    // preview: true, // 预览
    expand: true, // 全屏
    /* v0.0.9 */
    undo: true, // 撤销
    redo: true, // 重做
    save: true, // 保存 
    // subfield: true, // 单双栏模式
  };

  // 上传图片
  const addImg = (_file) => {
    console.log(_file)
    mdRef.current.$img2Url(_file.name, 'file_url');
  };

  const handleChange = (value)=> { 
    onChangeContext(value)  
  }

  return (
    <div style={{position: "relative"}}>
      {readOnly ? (
        <MdPreview content={value} />
      ) : (
        <Fragment>
          <Button style={{position: "absolute",right: "44px", top: "11px"}}
            size="small" 
            onClick={() => setVisible(true)}
          >
            预览
          </Button>
          <Modal
            title="Markdown内容预览"
            width="60%"
            okText="关闭"
            open={visible}
            onOk={() => setVisible(false)}
            onCancel={() => setVisible(false)}
            cancelButtonProps={{ style: { display: "none" } }}
          >
            <MdPreview content={value} />
          </Modal>

          <ForEditor
            placeholder="请输入Markdown文本"
            height={360}
            ref={mdRef}
            lineNum={true}
            toolbar={toolbar}
            value={value}
            onChange={handleChange}
            addImg={_file => addImg(_file)}
          />
        </Fragment>
      )}
    </div>
  );
}

组件最终样式

react项目中自定义一个markdown编辑器

MarkdownPreview.js:预览的主体代码

github地址:https://github.com/remarkjs/react-markdown

import React from "react";
import ReactMarkdown from "react-markdown";
import remarkMath from "remark-math";
import rehypeKatex from "rehype-katex";
import rehypeRaw from "rehype-raw";
 
/**
 * @param {string} content Markdown文本内容
 * @param {Boolean}  escapeHtml 是否转义html语法,参数为true后转义显示html源码
 */

export default function MarkdownPreview({ content }) {
  return (
    <ReactMarkdown   
      remarkPlugins={[remarkMath]}
      escapeHtml={true} // escapeHtml 是否转义html语法,参数为true后转义显示html源码
      rehypePlugins={[rehypeKatex, rehypeRaw]} 
    >
    {content}
    </ReactMarkdown>
  );
}

使用组件

import React, {forwardRef, useEffect, useState } from "react";
import { Button, Select, Space, Form, Input } from "antd";

// 引入自定义的MarkdownEditor组件
import MarkdownEditor from "./MarkdownEditor/Index";

const NewsAudit = forwardRef(({},ref)=> {  

  const [context, setcontext] = useState("") 
  const onChangeContext = (value) => {
    console.log(`onChangeContext`);
    console.log(value);
    setcontext(value)
  };

  return ( 
    <div>
        // 使用自定义的MarkdownEditor组件
        <MarkdownEditor onChangeContext = {onChangeContext} readOnly = {false} value= {context}></MarkdownEditor> 
    </div>
  );
})

export default NewsAudit;

参考文档文章来源地址https://www.toymoban.com/news/detail-417296.html

  • https://www.jianshu.com/p/a4746fce6ab3

到了这里,关于react项目中自定义一个markdown编辑器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Markdown编辑器 测试

    测试一下@TOC 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新

    2024年02月06日
    浏览(77)
  • Markdown编辑器

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你

    2024年02月02日
    浏览(30)
  • Avalonia开发Markdown编辑器

    今天熟悉Avalonia UI,做一个Markdown的文本编辑器。 代码我上传了Github,地址: https://github.com/raokun/AvaloniaMarkdown.git 我使用开发工具的是visual studio 2022 preview ,上一篇博客已经写过了SDK的安装和基础项目的创建,需要了解的可以跳转查看: 创建Avalonia 模板项目-基础 由于Avaloni

    2024年02月11日
    浏览(28)
  • Vue使用markdown编辑器

    1.安装 2.main.js全局注册 3.vue页面使用 4.文章预览

    2024年01月25日
    浏览(33)
  • VUE2.0集成 Markdown 编辑器

    Markdown编辑器的使用 这是一款基于Vue的markdown编辑器。既可以用来编辑Markdown语法,又可以用来解析 效果图,mavonEditor实现了Markdown集成 Markdown是一种标记语言,相较于word文档更加清晰方便,适合进行笔记等。将Markdown集成进入自己项目之后,就可以在项目中使用的Markdown编辑器

    2024年02月10日
    浏览(71)
  • asp.net MVC markdown编辑器

    在 ASP.NET MVC 中,你可以使用一些第三方 Markdown 编辑器来让用户在网页上方便地编辑和预览 Markdown 内容。这些编辑器通常提供实时预览功能,将 Markdown 文本转换为实时渲染的 HTML,并支持编辑器工具栏来辅助用户编辑。 以下是一些流行的 ASP.NET MVC Markdown 编辑器: Editor.md :

    2024年02月15日
    浏览(32)
  • 推荐几款主流好用的markdown编辑器

    随着技术的不断发展和人们对效率的追求,Markdown 编辑器已经成为了许多人写作的首选工具。Markdown 是一种轻量级的标记语言,使用简单,方便快捷,且可以方便地转换成各种格式的文件。在这篇文章中,我们将介绍几款常用的 Markdown 编辑器,并分析它们的优缺点。 1、VS

    2024年02月11日
    浏览(33)
  • 一款好看的markdown编辑器:md-editor-v3

    md-editor-v3 的 github地址 及使用文档 md-editor-v3 预览效果地址 mavon-editor文本编辑器上传图片用法 Vue富文本编辑器-mavon-editor文本编辑器 v-md-editor使用 生成el-tree文章目录滚动跟随高亮 English | 中文 vue3 环境的 Markdown 编辑器,使用 jsx 和 typescript 语法开发,支持在 tsx 项目使用。 文

    2024年02月07日
    浏览(31)
  • CentOS使用docker本地部署StackEdit Markdown编辑器并实现公网访问

    StackEdit是一个受欢迎的Markdown编辑器,在GitHub上拥有20.7k Star!,它支持将Markdown笔记保存到多个仓库,包括Gitee、GitHub和Gitea。此在线笔记工具还提供了一些便捷功能,如拖拽或粘贴上传图片、文件搜索功能,以及可切换为炫酷的暗黑主题,这些功能特别适合那些喜欢使用Mar

    2024年01月19日
    浏览(35)
  • 前端:推荐一款开源免费的浏览器端Markdown编辑器Vditor

    目前程序员的世界到处都是Markdown ,比如CSDN、简书、GitCha、 GitHub、掘金社区等等都支持Markdown文档,另外近几年许多官方技术文档都是使用Markdown来写的。 使用Markdown不仅可以非常方便的写博客、写技术文档,而且可以直接导出对应的网站内容,导出可打印的文档 ,另外Ma

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包