簡介
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-css
和katex
僅會在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 |
---|---|---|
refs.toolbar_left.$imgDelByFilename(>=2.1.6) | String: filename | 主動刪除對應圖片文件, 如果成功返回TRUE蹋辅,否則返回FALSE, (并將其從 md 源碼中刪除 (>=2.4.16)) |
refs.toolbar_left.$imgAddByFilename(>=2.1.6) | String: filename, File: file | 添加對應圖片文件,文件別名為filename(filename 必須為 ./filename 樣式), 如果成功返回TRUE挫掏,否則返回FALSE |
refs.toolbar_left.$imgUpdateByFilename(>=2.1.6) | String: filename, File: file | 更新對應文件名的圖片文件(filename 必須為 ./filename 樣式), 如果成功返回TRUE侦另,否則返回FALSE |
imgUpdateByUrl(>=2.1.5) | String: filename, String: url | 將md源碼中圖片文件名替換為url(如[圖片上傳失敗...(image-f2acd-1563459410369)] -> [圖片上傳失敗...(image-608741-1563459410369)] ) |
注意:
$vm
指為mavonEditor
實例,可以通過如下兩種方式獲取
- 通過引入對象獲取:
import {mavonEditor} from ...
等方式引入后尉共,此時$vm
即為mavonEditor
- 通過vm
為
this.$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換行格式必須為行尾添加兩空格