基于Vue的markdown插件-mavon-editor

簡介

mavon-editor是一個基于Vue的markdown的編輯器。

安裝

npm install mavon-editor --save

使用mavon-editor

在Vue中引入項目

main.js(全局引入)

import Vue from 'vue'
import mavonEditor from 'mavon-editor'
import 'mavon-editor/dist/css/index.css'
// use
Vue.use(mavonEditor)

index.html(放置編輯器的頁面)

<mavon-editor v-model="value"/>

在nuxt.js中使用

在工程目錄下plugins下新建vue-mavon-editor.js

import Vue from 'vue';
import mavonEditor from 'mavon-editor';
import 'mavon-editor/dist/css/index.css';
//use
Vue.use(mavonEditor);

然后在nuxt.config.js中添加plugins配置

 plugins: [
  //...
    { src: '@/plugins/vue-mavon-editor', srr: false }
  ],

在頁面中或組件中引入

<template>
  <div class="mavonEditor">
    <no-ssr>
      <mavon-editor :toolbars="markdownOption" v-model="handbook"/>
    </no-ssr>
  </div>
</template>
<script>
export default {
  data() {
    return {
      markdownOption: {
        bold: true, // 粗體
        ... // 更多配置
      },
      handbook: "#### how to use mavonEditor in nuxt.js"
    };
  }
};
</script>
<style scoped>
.mavonEditor {
  width: 100%;
  height: 100%;
}
</style>

配置工具欄

默認配置:

/*
    默認工具欄按鈕全部開啟, 傳入自定義對象
    例如: {
         bold: true, // 粗體
         italic: true,// 斜體
         header: true,// 標題
    }
    此時, 僅僅顯示此三個功能鍵
 */

完整配置屬性:

toolbars: {
      bold: true, // 粗體
      italic: true, // 斜體
      header: true, // 標題
      underline: true, // 下劃線
      strikethrough: true, // 中劃線
      mark: true, // 標記
      superscript: true, // 上角標
      subscript: true, // 下角標
      quote: true, // 引用
      ol: true, // 有序列表
      ul: true, // 無序列表
      link: true, // 鏈接
      imagelink: true, // 圖片鏈接
      code: true, // code
      table: true, // 表格
      fullscreen: true, // 全屏編輯
      readmodel: true, // 沉浸式閱讀
      htmlcode: true, // 展示html源碼
      help: true, // 幫助
      /* 1.3.5 */
      undo: true, // 上一步
      redo: true, // 下一步
      trash: true, // 清空
      save: true, // 保存(觸發(fā)events中的save事件)
      /* 1.4.2 */
      navigation: true, // 導航目錄
      /* 2.1.8 */
      alignleft: true, // 左對齊
      aligncenter: true, // 居中
      alignright: true, // 右對齊
      /* 2.2.1 */
      subfield: true, // 單雙欄模式
      preview: true, // 預覽
  }

API文檔

name type default description
language String zh-CN 語言選擇酣胀,暫支持 zh-CN: 中文簡體 , en: 英文 瘟忱, fr: 法語, pt-BR: 葡萄牙語, ru: 俄語股耽, de: 德語蹄咖, ja: 日語
fontSize String 15px 編輯區(qū)域文字大小
scrollStyle Boolean true 開啟滾動條樣式(暫時僅支持chrome)
boxShadow Boolean true 開啟邊框陰影
subfield Boolean true true: 雙欄(編輯預覽同屏)褐健, false: 單欄(編輯預覽分屏)
defaultOpen String edit: 默認展示編輯區(qū)域 , preview: 默認展示預覽區(qū)域 , 其他 = edit
placeholder String 開始編輯... 輸入框為空時默認提示文本
editable Boolean true 是否允許編輯
codeStyle String code-github markdown樣式: 默認github,可選配色方案
toolbarsFlag Boolean true 工具欄是否顯示
navigation Boolean false 默認展示目錄
shortCut Boolean true 是否啟用快捷鍵
autofocus Boolean true 自動聚焦到文本框
ishljs Boolean true 代碼高亮
imageFilter function null 圖片過濾函數澜汤,參數為一個File Object蚜迅,要求返回一個Boolean, true表示文件合法,false表示文件不合法

Event事件綁定

name params description
change String: value , String: render 編輯區(qū)發(fā)生變化的回調事件(render: value 經過markdown解析后的結果)
save String: value , String: render ctrl + s 的回調事件(保存按鍵,同樣觸發(fā)該回調)
fullScreen Boolean: status , String: value 切換全屏編輯的回調事件(boolean: 全屏開啟狀態(tài))
readModel Boolean: status , String: value 切換沉浸式閱讀的回調事件(boolean: 閱讀開啟狀態(tài))
htmlCode Boolean: status , String: value 查看html源碼的回調事件(boolean: 源碼開啟狀態(tài))
subfieldToggle Boolean: status , String: value 切換單雙欄編輯的回調事件(boolean: 雙欄開啟狀態(tài))
previewToggle Boolean: status , String: value 切換預覽編輯的回調事件(boolean: 預覽開啟狀態(tài))
helpToggle Boolean: status , String: value 查看幫助的回調事件(boolean: 幫助開啟狀態(tài))
navigationToggle Boolean: status , String: value 切換導航目錄的回調事件(boolean: 導航開啟狀態(tài))
imgAdd String: filename, File: imgfile 圖片文件添加回調事件(filename: 寫在md中的文件名, File: File Object)
imgDel String: filename 圖片文件刪除回調事件(filename: 寫在md中的文件名)

代碼高亮

開啟代碼高亮俊抵,如果要關閉將ishljs設置為false即可

// ishljs默認為true
<mavon-editor :ishljs = "true"></mavon-editor>

代碼高亮插件highlight.js中的語言解析文件和代碼高亮樣式將在使用時加載谁不,github-markdown-csskatex僅會在mounted時加載

Notice: 可選配色方案支持的語言 是從 highlight.js/9.12.0 導出的

# 圖片上傳

<template>
    <mavon-editor ref=md @imgAdd="$imgAdd" @imgDel="$imgDel"></mavon-editor>
</template>
exports default {
    methods: {
        // 綁定@imgAdd event
        $imgAdd(pos, $file){
            // 第一步.將圖片上傳到服務器.
           var formdata = new FormData();
           formdata.append('image', $file);
           axios({
               url: 'server url',
               method: 'post',
               data: formdata,
               headers: { 'Content-Type': 'multipart/form-data' },
           }).then((url) => {
               // 第二步.將返回的url替換到文本原位置![...](0) -> ![...](url)
               /**
               * $vm 指為mavonEditor實例,可以通過如下兩種方式獲取
               * 1. 通過引入對象獲取: `import {mavonEditor} from ...` 等方式引入后徽诲,`$vm`為`mavonEditor`
               * 2. 通過$refs獲取: html聲明ref : `<mavon-editor ref=md ></mavon-editor>刹帕,`$vm`為 `this.$refs.md`
               */
               $vm.$img2Url(pos, url);
           })
        }
    }
}
  • 默認大小樣式為min-height:300px,min-width:300px可以自行覆蓋
  • 基礎z-index:1500
  • 僅用作展示可以設置props:toolbarsFlag:false吵血,subfield:false,defaultOpen:"preview"

方式1:圖片上傳至文件服務器

  • 每次添加圖片觸發(fā)上傳
<template>
    <mavon-editor ref=md @imgAdd="$imgAdd" @imgDel="$imgDel"></mavon-editor>
</template>
exports default {
    methods: {
        // 綁定@imgAdd event
        $imgAdd(pos, $file){
            // 第一步.將圖片上傳到服務器.
           var formdata = new FormData();
           formdata.append('image', $file);
           axios({
               url: 'server url',
               method: 'post',
               data: formdata,
               headers: { 'Content-Type': 'multipart/form-data' },
           }).then((url) => {
               // 第二步.將返回的url替換到文本原位置![...](0) -> ![...](url)
               // $vm.$img2Url 詳情見本頁末尾
               $vm.$img2Url(pos, url);
           })
        }
    }
}
  • 統(tǒng)一上傳多張圖片
<template>
    <!--點擊按鈕觸發(fā)圖片統(tǒng)一上傳-->
    <button @click="uploadimg">upload</button>
    <mavon-editor ref=md @imgAdd="$imgAdd" @imgDel="$imgDel"></mavon-editor>
</template>
exports default {
    data(){
        return {
            img_file: {}
        }
    },
    methods: {
        // 綁定@imgAdd event
        $imgAdd(pos, $file){
            // 緩存圖片信息
            this.img_file[pos] = $file;
        },
        $imgDel(pos){
            delete this.img_file[pos];
        },
        uploadimg($e){
            // 第一步.將圖片上傳到服務器.
            var formdata = new FormData();
            for(var _img in this.img_file){
                formdata.append(_img, this.img_file[_img]);
            }
            axios({
                url: 'server url',
                method: 'post',
                data: formdata,
                headers: { 'Content-Type': 'multipart/form-data' },
            }).then((res) => {
                /**
                 * 例如:返回數據為 res = [[pos, url], [pos, url]...]
                 * pos 為原圖片標志(0)
                 * url 為上傳后圖片的url地址
                 */
                 // 第二步.將返回的url替換到文本原位置![...](0) -> ![...](url)
                for (var img in res) {
                    // $vm.$img2Url 詳情見本頁末尾
                    $vm.$img2Url(img[0], img[1]);
                }
            })
        },
    }
}

方式2:將圖片保存為base64編碼

<template>
    <mavon-editor ref=md @imgAdd="$imgAdd" v-model="mdStr" @imgDel="$imgDel"></mavon-editor>
</template>
exports default {
    data() {
        return {
            mdStr: '### demo \n ![image](0)'
        };
    },
    mounted() {
        // 如果原始md字符串中存在曾上傳的圖片偷溺, 則需要將對應<img>中的src替換為base64
        this.$nextTick(() => {
            // $vm.$imgUpdateByUrl 詳情見本頁末尾
            $vm.$imgUpdateByUrl(0, base64內容);
        }
    },
    methods: {
        $imgAdd(pos, $file){
            // 將圖片上傳到服務器.
           var formdata = new FormData();
           formdata.append('image', $file);
           axios({
               url: 'server url',
               method: 'post',
               data: formdata,
               headers: { 'Content-Type': 'multipart/form-data' },
           }).then((flag) => {
           })
        }
    }
}

圖片事件

name params describe
vm.refs.toolbar_left.$imgDelByFilename(>=2.1.6) String: filename 主動刪除對應圖片文件, 如果成功返回TRUE蹋辅,否則返回FALSE, (并將其從 md 源碼中刪除 (>=2.4.16))
vm.refs.toolbar_left.$imgAddByFilename(>=2.1.6) String: filename, File: file 添加對應圖片文件,文件別名為filename(filename 必須為 ./filename 樣式), 如果成功返回TRUE挫掏,否則返回FALSE
vm.refs.toolbar_left.$imgUpdateByFilename(>=2.1.6) String: filename, File: file 更新對應文件名的圖片文件(filename 必須為 ./filename 樣式), 如果成功返回TRUE侦另,否則返回FALSE
vm.imgUpdateByUrl(>=2.1.5) String: filename, String: url 將md源碼中圖片文件名替換為url(如[圖片上傳失敗...(image-f2acd-1563459410369)] -> [圖片上傳失敗...(image-608741-1563459410369)])

注意: $vm指為mavonEditor實例,可以通過如下兩種方式獲取

  1. 通過引入對象獲取: import {mavonEditor} from ... 等方式引入后尉共,此時$vm即為mavonEditor
  2. 通過refs獲取: html聲明ref : `<mavon-editor ref=md ></mavon-editor>淋肾, 此時`vmthis.$refs.md`

Markdown-It

獲取mavonEditor中的markdown-it對象

方法1:全局引入mavonEditor獲取

import mavonEditor from 'mavon-editor'
Vue.use(mavonEditor)
//...
mavonEditor.markdownIt

方法2:局部引入mavonEditor獲取

import {mavonEditor} from 'mavon-editor'
mavonEditor.getMarkdownIt()
或者
mavonEditor.mixins[0].data().markdownIt

方法3:通過mavonEditor的實例獲取

 <mavonEditor ref=md></mavonEditor>
 //...
 this.refs.md.markdownIt

使用markdown-it對象

// markdownIt通過上述方式獲取
markdownIt.set({ breaks: false });

設置markdown換行格式必須為行尾添加兩空格

跟多markdown-it設置

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爸邢,隨后出現的幾起案子樊卓,更是在濱河造成了極大的恐慌,老刑警劉巖杠河,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碌尔,死亡現場離奇詭異,居然都是意外死亡券敌,警方通過查閱死者的電腦和手機唾戚,發(fā)現死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來待诅,“玉大人叹坦,你說我怎么就攤上這事”把悖” “怎么了募书?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長测蹲。 經常有香客問我莹捡,道長,這世上最難降的妖魔是什么扣甲? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任篮赢,我火速辦了婚禮,結果婚禮上琉挖,老公的妹妹穿的比我還像新娘启泣。我一直安慰自己,他們只是感情好示辈,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布寥茫。 她就那樣靜靜地躺著,像睡著了一般顽耳。 火紅的嫁衣襯著肌膚如雪坠敷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天射富,我揣著相機與錄音膝迎,去河邊找鬼。 笑死胰耗,一個胖子當著我的面吹牛限次,可吹牛的內容都是我干的。 我是一名探鬼主播柴灯,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼卖漫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赠群?” 一聲冷哼從身側響起羊始,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎查描,沒想到半個月后突委,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡冬三,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年匀油,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勾笆。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡敌蚜,死狀恐怖,靈堂內的尸體忽然破棺而出窝爪,到底是詐尸還是另有隱情弛车,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布蒲每,位于F島的核電站帅韧,受9級特大地震影響,放射性物質發(fā)生泄漏啃勉。R本人自食惡果不足惜忽舟,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淮阐。 院中可真熱鬧叮阅,春花似錦、人聲如沸泣特。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽状您。三九已至勒叠,卻和暖如春兜挨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眯分。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工拌汇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弊决。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓噪舀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親飘诗。 傳聞我的和親對象是個殘疾皇子与倡,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容

  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    柴東啊閱讀 15,848評論 2 140
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    小姜先森o0O閱讀 9,395評論 0 72
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    你猜_3214閱讀 11,035評論 0 118
  • 一、UI組件及框架 element - 餓了么出品的Vue2的web UI工具套件mint-ui - Vue 2的...
    Yin先生閱讀 3,005評論 0 33
  • 此刻 躺在沙發(fā)上面 房子里靜悄悄的 靜的可以聽到心跳的聲音 此刻 聽著窗外滴滴答答的雨聲 此起彼伏 仿佛...
    一顆樹007閱讀 309評論 0 1