來康康vue3環(huán)境下的markdown編輯器md-editor-v3吧扯罐,支持tsx,暗黑模式哦~

開發(fā)背景

這一切都源于在開發(fā)vue3-admin的demo內(nèi)容時烦衣,沒有合適的編輯器組件篮赢。

在線預(yù)覽

傳送門

說明

僅支持 vue3 項(xiàng)目下使用齿椅,使用 jsx 語法開發(fā)琉挖,支持在 tsx 項(xiàng)目使用启泣。為了減小插入,沒有使用less.modifyVars方法來切換主題示辈,而采用了替換 class 名稱的方式寥茫。

代碼倉庫:md-editor-v3

功能一覽

  1. 快捷插入內(nèi)容工具欄、編輯器瀏覽器全屏矾麻、頁面內(nèi)全屏等纱耻;
  2. 內(nèi)置的白色主題和暗黑主題,支持綁定切換险耀;
  3. 支持快捷鍵插入內(nèi)容弄喘;
  4. 支持使用 prettier 格式化內(nèi)容(使用 CDN 方式引入,只支持格式化 md 內(nèi)容甩牺,可在代碼內(nèi)設(shè)置關(guān)閉)蘑志;
  5. 支持多語言,支持自行擴(kuò)展語言贬派;
  6. 支持復(fù)制粘貼上傳圖片急但;
  7. ...

更多功能待后續(xù)更新,若有想要的功能未開發(fā)搞乏,請留言~

預(yù)覽圖

默認(rèn)模式下:

image

暗黑模式下:

image

apis

注意在 jsx 下需使用 modelValue 配合 onChange 方法完成數(shù)據(jù)綁定波桩,在 vue 模板語法下,可以直接使用 v-modal 指令~

props

名稱 類型 默認(rèn)值 說明
modelValue String '' md 編輯內(nèi)容请敦,vue 模板支持雙向綁定(v-model="value")
editorClass String '' 編輯器最外層樣式
hljs Object null 項(xiàng)目中使用到了 highlight镐躲,可將實(shí)例直接傳遞,生產(chǎn)環(huán)境則不會請求 CDN侍筛,需要手動導(dǎo)入支持的高亮代碼樣式
highlightJs String highlight.js highlightJs CDN
highlightCss String atom-one-dark 預(yù)覽高亮代碼樣式
historyLength Number 10 最大記錄操作數(shù)(太大會占用內(nèi)存)
pageFullScreen Boolean false 瀏覽器內(nèi)全屏
preview Boolean true 預(yù)覽模式
htmlPreview Boolean false html 預(yù)覽
language String 'zh-CN' 內(nèi)置中英文('zh-CN','en-US')萤皂,可自行擴(kuò)展其他語言,同時可覆蓋內(nèi)置的中英文
languageUserDefined Array [{key: StaticTextDefaultValue}] 通過這里擴(kuò)展語言勾笆,修改 language 值為擴(kuò)展 key 即可敌蚜,類型申明可手動導(dǎo)入
toolbars Array [all] 選擇性展示工具欄,可選內(nèi)容如下[toolbars]
prettier Boolean true 是否啟用 prettier 優(yōu)化 md 內(nèi)容
prettierCDN String standalone
prettierMDCDN String parser-markdown
editorName String 'editor' 當(dāng)在同一頁面放置了多個編輯器窝爪,最好提供該屬性以區(qū)別某些帶有 ID 的內(nèi)容

[toolbars]

[
  'bold',
  'underline',
  'italic',
  'strikeThrough',
  'title',
  'sub',
  'sup',
  'quote',
  'unorderedList',
  'orderedList',
  'codeRow',
  'code',
  'link',
  'image',
  'table',
  'revoke',
  'next',
  'save',
  'pageFullscreen',
  'fullscreen',
  'preview',
  'htmlPreview',
  'github'
];

自定義語言弛车,需要替換的內(nèi)容如下(某些字段若不主動提供,可能會造成頁面不美觀):

[StaticTextDefaultValue]

export interface StaticTextDefaultValue {
  toolbarTips?: ToolbarTips;
  titleItem?: {
    h1?: string;
    h2?: string;
    h3?: string;
    h4?: string;
    h5?: string;
    h6?: string;
  };
  linkModalTips?: {
    title?: string;
    descLable?: string;
    descLablePlaceHolder?: string;
    urlLable?: string;
    UrlLablePlaceHolder?: string;
    buttonOK?: string;
    buttonUpload?: string;
  };
}

事件綁定

名稱 入?yún)?/th> 說明
onChange v:String 內(nèi)容變化事件(當(dāng)前與textareoninput事件綁定蒲每,每輸入一個單字即會觸發(fā))
onSave v:String 保存事件纷跛,快捷鍵與保存按鈕均會觸發(fā)
onUploadImg files:FileList, callback:Function 上傳圖片事件,彈窗會等待上傳結(jié)果邀杏,務(wù)必將上傳后的 urls 作為 callback 入?yún)⒒貍?/td>

快捷鍵

主要以CTRL搭配對應(yīng)功能英文單詞首字母贫奠,沖突項(xiàng)添加SHIFT唬血,再沖突替換為ALT

鍵位 功能 說明 開發(fā)標(biāo)記
CTRL + S 保存 觸發(fā)編輯器的onSave回調(diào)
CTRL + B 加粗 **加粗**
CTRL + U 下劃線 <u>下劃線</u>
CTRL + I 斜體 *斜體*
CTRL + 1-6 1-6 級標(biāo)題 # 標(biāo)題
CTRL + ↑ 上角標(biāo) <sup>上角標(biāo)</sup>
CTRL + ↓ 下角標(biāo) <sub>下角標(biāo)</sub>
CTRL + Q 引用 > 引用
CTRL + O 有序列表 1. 有序列表
CTRL + L 鏈接 [鏈接](https://imbf.cc)
CTRL + T 表格 |表格| 放棄開發(fā)(無法實(shí)現(xiàn)) x
CTRL + Z 撤回 觸發(fā)編輯器內(nèi)內(nèi)容撤回唤崭,與系統(tǒng)無關(guān)
CTRL + SHIFT + S 刪除線 ~刪除線~
CTRL + SHIFT + U 無序列表 - 無序列表
CTRL + SHIFT + C 塊級代碼 多行代碼塊
CTRL + SHIFT + I 圖片鏈接 [圖片上傳失敗...(image-bb3132-1626773067693)]
CTRL + SHIFT + Z 前進(jìn)一步 觸發(fā)編輯器內(nèi)內(nèi)容前進(jìn)拷恨,與系統(tǒng)無關(guān)
CTRL + SHIFT + F 美化內(nèi)容
CTRL + ALT + C 行內(nèi)代碼 行內(nèi)代碼塊

演示

yarn add md-editor-v3

jsx 語法項(xiàng)目

import { defineComponent, reactive } from 'vue';
import Editor from 'md-editor-v3';
import 'md-editor-v3/lib/style.css';
import hljs from 'highlight.js';
import 'highlight.js/styles/atom-one-dark.css';

export default defineComponent({
  setup() {
    const md = reactive({
      text: 'default markdown content'
    });
    return () => (
      <Editor hljs={hljs} modelValue={md.text} onChange={(value) => (md.text = value)} />
    );
  }
});

vue 模板項(xiàng)目

<template>
  <editor v-model="text" pageFullScreen></editor>
</template>

<script>
import { defineComponent } from 'vue';
import Editor from 'md-editor-v3';
import 'md-editor-v3/lib/style.css';

export default defineComponent({
  name: 'VueTemplateDemo',
  components: { Editor },
  data() {
    return {
      text: '默認(rèn)值'
    };
  }
});
</script>

上傳圖片

默認(rèn)可以選擇多張圖片,支持粘貼板上傳圖片谢肾。

注意:粘貼板上傳時腕侄,如果是網(wǎng)頁上的 gif 圖,無法正確上傳為 gif 格式芦疏!

async onUploadImg(files: FileList, callback: (urls: string[]) => void) {
  const res = await Promise.all(
    Array.from(files).map((file) => {
      return new Promise((rev, rej) => {
        const form = new FormData();
        form.append('file', file);

        axios
          .post('/api/img/upload', form, {
            headers: {
              'Content-Type': 'multipart/form-data'
            }
          })
          .then((res) => rev(res))
          .catch((error) => rej(error));
      });
    })
  );

  callback(res.map((item: any) => item.data.url));
}

結(jié)尾

該項(xiàng)目目前只生存了3周冕杠,使用中有bug期待你能留言給我,有想要的功能期待了解哦酸茴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末分预,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子薪捍,更是在濱河造成了極大的恐慌笼痹,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飘诗,死亡現(xiàn)場離奇詭異与倡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)昆稿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門纺座,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人溉潭,你說我怎么就攤上這事净响。” “怎么了喳瓣?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵馋贤,是天一觀的道長。 經(jīng)常有香客問我畏陕,道長配乓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任惠毁,我火速辦了婚禮犹芹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鞠绰。我一直安慰自己腰埂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布蜈膨。 她就那樣靜靜地躺著屿笼,像睡著了一般牺荠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驴一,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天休雌,我揣著相機(jī)與錄音,去河邊找鬼蛔趴。 笑死挑辆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孝情。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼洒嗤,長吁一口氣:“原來是場噩夢啊……” “哼箫荡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渔隶,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羔挡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后间唉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绞灼,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年呈野,在試婚紗的時候發(fā)現(xiàn)自己被綠了低矮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡被冒,死狀恐怖军掂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昨悼,我是刑警寧澤蝗锥,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站率触,受9級特大地震影響终议,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葱蝗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一穴张、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垒玲,春花似錦陆馁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽击狮。三九已至,卻和暖如春益老,著一層夾襖步出監(jiān)牢的瞬間彪蓬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工捺萌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留档冬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓桃纯,卻偏偏與公主長得像酷誓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子态坦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355