91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Vue實現一個markdown編輯器

發布時間:2021-04-02 11:11:16 來源:億速云 閱讀:884 作者:小新 欄目:web開發

這篇文章主要介紹如何使用Vue實現一個markdown編輯器,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

先看一下本項目的效果圖(圖片經過壓縮)

如何使用Vue實現一個markdown編輯器

本文的目的就是實現一個有核心功能的,簡單,易于修改的項目

思路

1 markdown內容如何轉換成 html?

網上有一個開源的庫叫 marked,地址如下:https://github.com/markedjs/marked.git

我們可以安裝這個庫,使用很簡單,就一個函數,傳進去markdown內容,就返回了html內容

2 markdown內容轉換成了html,如何進行語法高亮?

網上也有一個開源的庫,地址如下 :https://highlightjs.org/

我們可以使用這兩個庫

先把markdown內容解析成html內容

把html內容進行語法高亮

下面我們來一步一步實現代碼

3 代碼實現

默認你已經創建好了vue的項目 , 創建vue項目 vue init webpack demo
這里面不多講。

3.1 安裝兩個庫,分別執行下面兩條命令

npm install marked --save
npm install highlight.js --save

3.2 首先創建一個 HelloMarkDown 的 Vue組件

布局文件的代碼如下:

<template>
 <div class="md_root_content" v-bind:>

 <!--功能按鈕區-->
 <div class="button_bar">
 <span v-on:click="addBold"><B>B</B></span>
 <span v-on:click="addUnderline"><B>U</B></span>
 <span v-on:click="addItalic"><B>I</B></span>
 </div>

 <!--主要內容區-->
 <div class="content_bar">

 <!--markdown編輯器區-->
 <div class="markdown_body">
 <textarea ref="ref_md_edit" class="md_textarea_content" v-model="markString">
 </textarea>
 </div>

 <!--解析成html區-->
 <div class="html_body">
 <p v-html="htmlString"></p>
 </div>

 </div>

 </div>
</template>

主要分為上下兩塊,上面是功能區的布局

下面一塊,分左右兩部分,左邊是markdown,右邊是顯示html部分

對應的樣式代碼如下:

<style scoped>

 .md_root_content {
 display: flex;
 display: -webkit-flex;
 flex-direction: column;
 }

 .button_bar {
 width: 100%;
 height: 40px;
 background-color: #d4d4d4;
 display: flex;
 display: -webkit-flex;
 align-items: center;
 }

 div.button_bar span {
 width: 30px;
 line-height: 40px;
 text-align: center;
 color: orange;
 cursor: pointer;
 }

 .content_bar {
 display: flex;
 display: -webkit-flex;
 width: 100%;
 height: 100%;
 }

 .markdown_body {
 width: 50%;
 height: 100%;
 display: flex;
 display: -webkit-flex;
 }

 .html_body {
 width: 50%;
 height: 100%;
 display: flex;
 display: -webkit-flex;
 background-color: #dfe9f1;
 }

 .md_textarea_content {
 flex: 1;
 height: 100%;
 padding: 12px;
 overflow: auto;
 box-sizing: border-box;
 resize: none;
 outline: none;
 border: none;
 background-color: #f4f4f4;
 font-size: 14px;
 color: #232323;
 line-height: 24px;
 }
</style>

業務邏輯部分的代碼如下:

<script>
 import marked from 'marked' //解析mardown語法的庫
 import hljs from 'highlight.js' //對代碼進行語法高亮的庫


 import testData from '../testData' //測試數據


 export default {
 name: "HelloMarkDown",

 props: {
 width: {
 type: String,
 default: '1000px'
 },

 height: {
 type: String,
 default: '600px'
 }
 },

 data() {
 return {
 markString: '',
 htmlString: '',
 }
 },

 mounted(){
 this.markString = testData
 },

 methods: {
 //加粗
 addBold() {
 this.changeSelectedText("**","**")
 },

 //斜體
 addItalic() {
 this.changeSelectedText("***","***")
 },

 addUnderline() {
 this.changeSelectedText("<u>","</u>")
 },

 changeSelectedText(startString,endString){
 let t = this.$refs.ref_md_edit
 if (window.getSelection) {
  if (t.selectionStart != undefined && t.selectionEnd != undefined) {

  let str1 = t.value.substring(0, t.selectionStart)
  let str2 = t.value.substring(t.selectionStart, t.selectionEnd)
  let str3 = t.value.substring(t.selectionEnd)

  let result = str1 + startString + str2 + endString + str3
  t.value = result
  this.markString = t.value
  }
 }
 }
 },

 watch: {

 //監聽markString變化
 markString: function (value) {
 marked.setOptions({
  renderer: new marked.Renderer(),
  gfm: true,
  tables: true,
  breaks: true,
  pedantic: false,
  sanitize: false,
  smartLists: true,
  smartypants: false
 })

 this.htmlString = marked(value)
 },

 //監聽htmlString并對其高亮
 htmlString: function (value) {
 this.$nextTick(() => {
  const codes = document.querySelectorAll(".html_body pre code");

  // elem 是一個 object
  codes.forEach(elem => {
  elem.innerHTML = "<ul><li>" + elem.innerHTML.replace(/\n/g, "\n</li><li>") + "\n</li></ul>"
  hljs.highlightBlock(elem);
  });
 });
 }
 }

 }
</script>

script中的代碼解釋

 props: {
 width: {
 type: String,
 default: '1000px'
 },

 height: {
 type: String,
 default: '600px'
 }
 },

width: 組件的寬度

height:組件的高度

 data() {
 return {
 markString: '',
 htmlString: '',
 }
 },

markString:保存我們輸入的markdown內容

htmlString:保存markdown內容轉換成的html內容,也就是通過marked函數轉換過來的

 mounted(){
  this.markString = testData
 },

顯示默認數據

 //加粗
  addBold() {
  this.changeSelectedText("**","**")
  },

  //斜體
  addItalic() {
  this.changeSelectedText("***","***")
  },

  //加下劃線
  addUnderline() {
  this.changeSelectedText("<u>","</u>")
  },

這三個函數都是調用了 changeSelectedText 函數

主要是對鼠標選中的內容進行改變,比如加粗效果,是在選中文本的兩邊分別添加 **

所以changeSelectedText函數的作用就是在選中的文本兩邊添加不同的md的符號

比如

this.changeSelectedText("","") ,就是在選中的文本左邊和右邊都添加**

然后再把最新的內容賦值給 this.$refs.ref_md_edit.value,同時也兩會給markString

這樣就可以做到選中文本加粗效果了

 //監聽markString變化
  markString: function (value) {
  marked.setOptions({
   renderer: new marked.Renderer(),
   gfm: true,
   tables: true,
   breaks: true,
   pedantic: false,
   sanitize: false,
   smartLists: true,
   smartypants: false
  })

  this.htmlString = marked(value)
  },

此時是監聽markString的變化

然后調用marked函數進行轉換成html內容,并賦值給htmlString

marked.setOptions 是設置一些配置,有興趣的可以查一下這些配置的作用

 //監聽htmlString并對其高亮
  htmlString: function (value) {
  this.$nextTick(() => {
   const codes = document.querySelectorAll(".html_body pre code");

   // elem 是一個 object
   codes.forEach(elem => {
   elem.innerHTML = "<ul><li>" + elem.innerHTML.replace(/\n/g, "\n</li><li>") + "\n</li></ul>"
   hljs.highlightBlock(elem);
   });
  });
  }

原本通過 highlight.js這個庫在顯示語法高亮的時候,是沒有行號的。這里我進行了擴展

通過 document.querySelectorAll(".html_body pre code") 找到nodeList

然后對其循環,動態添加 ul , li, 這樣就可以顯示行號了

不過這需要對 highlight的css文件添加幾個樣式

源碼里面我把highlight中的css文件全部copy到項目中了,使用的是github.css

具體位置是在項目中的 assets/markdown/styles/github.css

如果想使用其它的主題,可以自己修改其它的對應的css文件,這里使用了github的主題,所以只修改了github.css這一個文件

以上是“如何使用Vue實現一個markdown編輯器”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

榆中县| 孝感市| 广河县| 武定县| 韩城市| 太康县| 本溪市| 南木林县| 连江县| 新竹县| 佳木斯市| 简阳市| 司法| 开平市| 兴业县| 大荔县| 大港区| 上虞市| 辰溪县| 甘孜县| 新密市| 进贤县| 乳山市| 泗阳县| 满洲里市| 岱山县| 繁峙县| 丰原市| 叙永县| 宜丰县| 行唐县| 呈贡县| 北票市| 西丰县| 临高县| 黄浦区| 巴塘县| 靖远县| 南陵县| 兴宁市| 延川县|