【看后必会】一步步教你用React写一个markdown实时编辑器!

10 篇文章 1 订阅
10 篇文章 0 订阅

1. 实现效果

最近在用React写一个博客管理系统,有一个功能是添加新文章。在新建文章的页面,我希望做到像CSDN这样,左边是编辑区(markdown格式),右边是预览区。实时更新,编辑文本的同时,在预览区就能看到效果。

就自己动手实现了一个这样的组件,markdown实时预览编辑器

具体效果如下:

2. 实现过程

使用React实现,做成单独的一个组件。

首先HTML结构如下:

<header>基于React的markdown实时编辑器</header>
<div className="marked">
    {/* 编辑区 */}
    <div className="input-region markdownStyle"></div>
    {/* 预览区 */}
    <div className="show-region markdownStyle"></div>
</div>

稍微写一点样式,让编辑区和预览区左右布局。

定义一个hook,存储输入的内容:

const [text, setText] = useState('');

左边编辑区,让一个div可编辑,给其加上contentEditable属性,并让值为plaintext-only,表示编辑区域只能输入纯文本

<div className="input-region markdownStyle" contentEditable="plaintext-only"></div>

为什么不用textarea

div高度可自适应,可以拿到纯文本。

当左边编辑区内容改变时,将输入的纯文本存入到state,给编辑区的div加上onInput属性,通过事件对象拿到纯文本:

<div
    className="input-region markdownStyle"
    contentEditable="plaintext-only"
    onInput={e => {
        setText(e.target.innerText);
    }}
></div>

要渲染成markdown格式的内容,就需要插件来渲染,这里使用marked,代码高亮也有需求,使用highlight.js

yarn add marked highlight.js
import marked from 'marked';
import hljs from 'highlight.js';

配置markedhighlight

useEffect(() => {
    // 配置highlight
    hljs.configure({
        tabReplace: '',
        classPrefix: 'hljs-',
        languages: ['CSS', 'HTML', 'JavaScript', 'Python', 'TypeScript', 'Markdown'],
    });
    // 配置marked
    marked.setOptions({
        renderer: new marked.Renderer(),
        highlight: code => hljs.highlightAuto(code).value,
        gfm: true, //默认为true。 允许 Git Hub标准的markdown.
        tables: true, //默认为true。 允许支持表格语法。该选项要求 gfm 为true。
        breaks: true, //默认为false。 允许回车换行。该选项要求 gfm 为true。
    });
}, []);

引入github风格的代码高亮主题,但我自己又稍作了修改:

import './github-dark.css';

在预览区,使用React的标签属性dangerouslySetInnerHTMl来显示内容:

<div
    className="show-region markdownStyle"
    dangerouslySetInnerHTML={{
        __html: marked(text).replace(/<pre>/g, "<pre id='hljs'>"),
    }}
></div>

调用marked将文本渲染成markdown格式的内容。后面加replace是因为,我发现渲染过后不显示代码框背景色,就在<pre>标签加上了id,然后自己写了CSS,让其显示代码框背景。

整个组件写好之后,最终的代码:

import { useState, useEffect } from 'react';
import marked from 'marked';
import hljs from 'highlight.js';
import './github-dark.css';
import './index.css';

const Marked = () => {
    const [text, setText] = useState('');
    useEffect(() => {
        // 配置highlight
        hljs.configure({
            tabReplace: '',
            classPrefix: 'hljs-',
            languages: ['CSS', 'HTML', 'JavaScript', 'Python', 'TypeScript', 'Markdown'],
        });
        // 配置marked
        marked.setOptions({
            renderer: new marked.Renderer(),
            highlight: code => hljs.highlightAuto(code).value,
            gfm: true, //默认为true。 允许 Git Hub标准的markdown.
            tables: true, //默认为true。 允许支持表格语法。该选项要求 gfm 为true。
            breaks: true, //默认为false。 允许回车换行。该选项要求 gfm 为true。
        });
    }, []);
    return (
        <>
            <header>基于React的markdown实时编辑器</header>
            <div className="marked">
                <div
                    className="input-region markdownStyle"
                    contentEditable="plaintext-only"
                    // suppressContentEditableWarning
                    onInput={e => {
                        setText(e.target.innerText);
                    }}
                ></div>
                <div
                    className="show-region markdownStyle"
                    dangerouslySetInnerHTML={{
                        __html: marked(text).replace(/<pre>/g, "<pre id='hljs'>"),
                    }}
                ></div>
            </div>
        </>
    );
};

export default Marked;

3. 源代码

其他代码,如代码高亮主题文件样式文件,包括整个源代码,都放到了[Github]上,需要自取。

如果对你有帮助,帮忙点个小心心❤️~


📘📘欢迎在我的博客上访问:
https://lzxjack.top/

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
### 回答1: 你可以使用 react-markdown 这个库来实现 markdown 编辑器,它支持代码块的语法高亮。你可以使用以下代码来实现: ``` import ReactMarkdown from 'react-markdown'; import CodeBlock from './CodeBlock'; function MarkdownEditor({ markdown }) { return ( <ReactMarkdown source={markdown} renderers={{ code: CodeBlock }} /> ); } ``` 其中,CodeBlock 是一个自定义组件,用于渲染代码块。你可以在 CodeBlock 组件中使用 highlight.js 等库来实现语法高亮。 ### 回答2: 要编 React Markdown 编辑器,您可以按照以下步骤进行操作: 1. 首先,您需要创建一个 React 组件来作为编辑器的容器。可以使用 `create-react-app` 创建一个新的项目,然后在项目中创建一个名为 `MarkdownEditor` 的组件。 2. 在组件的 `state` 中添加一个 `text` 属性,用于保存用户在编辑器中输入的文本。 3. 在 `render` 方法中,将一个 `<textarea>` 元素添加到组件中,将其值设置为 `text` 属性,并在 `onChange` 事件中更新 `text` 的值。这样,当用户在文本框中输入或编辑时,`text` 属性将自动更新。 4. 接下来,您可以引入一个用于解析和渲染 Markdown 的库,如 `marked` 或 `react-markdown`。安装所需的库,并将其导入到 `MarkdownEditor` 组件中。 5. 在组件的 `render` 方法中,使用 `marked` 或 `react-markdown` 库来将 Markdown 文本渲染为 HTML。您可以将渲染后的 HTML 放置在一个 `<div>` 元素中,并将其显示在编辑器下方,以便用户可以预览他们的 Markdown 文本。 6. 最后,您可以根据需要添加其他功能,如保存编辑的 Markdown 文本、导出为其他文件格式等。这些功能可以通过添加适当的按钮和事件处理函数来实现。 综上所述,编 React Markdown 编辑器的关键步骤包括创建组件、设置 state、渲染输入框和预览区域,并使用 Markdown 渲染库将文本转换为 HTML。根据您的需求,您还可以添加其他功能来扩展编辑器的功能。 ### 回答3: React Markdown编辑器一个能够允许用户使用Markdown语法来编辑和渲染文本的组件。下面是一个简单的示例,展示了如何使用React库来编一个基本的Markdown编辑器。 首先,我们需要引入React和其他必要的库: ```javascript import React, { useState } from 'react'; import ReactMarkdown from 'react-markdown'; ``` 接下来,我们定义一个名为MarkdownEditor的函数组件,并使用useState钩子来管理用户在编辑器中输入的文本: ```javascript function MarkdownEditor() { const [markdownText, setMarkdownText] = useState(''); const handleInputChange = (event) => { setMarkdownText(event.target.value); } return ( <div> <textarea value={markdownText} onChange={handleInputChange} /> <ReactMarkdown> {markdownText} </ReactMarkdown> </div> ); } ``` 在这个组件中,textarea元素用于接收用户输入的Markdown文本,并通过handleInputChange函数来更新markdownText状态。然后,将markdownText作为props传递给ReactMarkdown组件,以便渲染Markdown格式的文本。 最后,我们可以在应用的根组件中使用MarkdownEditor组件: ```javascript function App() { return ( <div> <h1>Markdown Editor</h1> <MarkdownEditor /> </div> ); } export default App; ``` 通过在根组件中引入和使用MarkdownEditor组件,我们就可以在应用中显示和编辑Markdown文本了。 以上是一个简单的React Markdown编辑器的实现示例。你还可以根据自己的需求进行扩展和修改,比如添加更多的Markdown语法支持、自定义样式等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火星飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值