首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau
百百 BLOG
首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau

Kurau Blog

「隨心而寫,真真假假,都是我」

一個記錄生活、輸出興趣的個人空間。
遊戲、影視、閱讀、學習……每一段體驗都值得留下文字。

頁面導覽

  • 學習紀錄
  • 遊戲心得
  • 影視Life
  • 書單
  • 委託作品與二創
  • Kurau
  • 合作邀請

找到我

歡迎來 Discord 找我聊天!

“曾經發生的事不可能忘記,只是暫時想不起來而已。”-《神隱少女》

© 2026 Kurau All rights reserved

開發工具

網頁上實現markdown編輯

By Kurau·2023-02-04·Updated 2026-05-09·2 分鐘閱讀

TL;DR
React 顯示 / 編輯 Markdown 用 react-markdown 套件。比 dangerouslySetInnerHTML 安全(不直接塞 HTML)。GFM 加 remark-gfm、語法 highlight 加 rehype-pretty-code、雙欄編輯器配 <textarea> + state。複雜 WYSIWYG 用 TipTap 或 MDXEditor。

在網頁上實現 Markdown 編輯

在 React 網頁上要顯示或編輯 Markdown 內容,最簡單的方式就是用 react-markdown 這個套件。它把 Markdown 字串解析成真正的 React 元素,而不是用 dangerouslySetInnerHTML 塞 HTML 進去,安全性比較好。

安裝

npm install react-markdown
bash

基本用法

import ReactMarkdown from 'react-markdown';

function Preview({ source }: { source: string }) {
  return <ReactMarkdown>{source}</ReactMarkdown>;
}
tsx

直接把 Markdown 字串當 children 丟進去就會渲染。

GFM(GitHub Flavored Markdown)支援

預設只支援 CommonMark,要表格、刪除線、checkbox 等語法得加 remark-gfm:

npm install remark-gfm
bash
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';

<ReactMarkdown remarkPlugins={[remarkGfm]}>{source}</ReactMarkdown>
tsx

自訂元素樣式

要讓某個 tag 渲染成自訂 component(例如把所有 <a> 加上 target="_blank",或讓 <code> 套用 syntax highlighting):

<ReactMarkdown
  components={{
    a: ({ href, children }) => (
      <a href={href} target="_blank" rel="noopener noreferrer">{children}</a>
    ),
    code: ({ className, children }) => (
      <code className={className}>{children}</code>
    ),
  }}
>
  {source}
</ReactMarkdown>
tsx

雙欄編輯器

要做「左邊輸入、右邊預覽」的編輯器,搭 <textarea> + state 即可:

import { useState } from 'react';
import ReactMarkdown from 'react-markdown';

export function MarkdownEditor() {
  const [text, setText] = useState('# Hello');
  return (
    <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16 }}>
      <textarea value={text} onChange={(e) => setText(e.target.value)} />
      <div><ReactMarkdown>{text}</ReactMarkdown></div>
    </div>
  );
}
tsx

注意事項

  • 不要直接渲染 raw HTML:預設會擋掉 <script> 等危險標籤,要顯式啟用 rehype-raw 才會解析 HTML(同時要自己處理 XSS)
  • 複雜編輯器(WYSIWYG、支援拖拉、表格 GUI)可以考慮 TipTap 或 MDXEditor,它們是基於 ProseMirror 的完整解決方案

目錄

    ◆ 相關文章

    • 複製你的hightlight 程式碼

      2026-05-09
    • 讓你網頁的Code語法 Hightlight起來

      2026-05-09
    • github 多個帳戶 SSH登入

      2026-05-09
    • lodash

      2026-05-09
    ← 上一篇箭頭函數 和 一般函數的 差別下一篇 →聽過Event Loop嗎

    ◆ 關於作者

    Kurau

    個人寫作 / 創作的 SoT,記錄遊戲、影視、學習與生活。

    更多 Kurau 的文章