最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用vue-markdown實現(xiàn)markdown文件預覽

 更新時間:2025年04月11日 10:17:57   作者:VT.饅頭  
Vue-Markdown 是一個輕量級且高效的庫,用于在Vue.js應用程序中渲染Markdown文本,下面我們來看看如何使用vue-markdown實現(xiàn)markdown文件預覽效果吧

Vue-Markdown 是一個輕量級且高效的庫,用于在Vue.js應用程序中渲染Markdown文本。它允許開發(fā)者以簡潔的方式將Markdown的強大功能與Vue組件的靈活性相結合,提升開發(fā)效率和用戶體驗。vue-markdown 是一個基于 marked.js 的 Vue Markdown 插件。它是一個簡單易用的 Markdown 解析器,可以方便地將 Markdown 文檔解析為 HTML。它有如下特點:

功能強大:支持 Markdown 語法的全部特性,例如標題、列表、鏈接等。

易于使用:只需要在 Vue 組件中引入 vue-markdown 插件,并使用簡單的模板語法即可實現(xiàn) Markdown 的解析和渲染。

高性能:基于 marked.js,性能優(yōu)異,可以快速地解析和渲染大量的 Markdown 文檔。

擴展性強:支持自定義渲染規(guī)則,可以通過插件擴展功能,以滿足更多的需求。

一、插件使用

1、插件說明

vue-markdown插件的靈活性較好,支持直接傳遞Markdown字符串,或者通過綁定數(shù)據(jù)屬性來動態(tài)渲染Markdown。此外,還可以自定義渲染規(guī)則,擴展或替換特定的Markdown語法,以滿足個性化需求。在github上看了作者的源碼,發(fā)現(xiàn)該插件也引入了markdown-it,并且支持大部分的markdown-it的插件,通過插件的引入即可使用。

官方demo

1)slots

在組件中使用 vue-markdown 插件,可以在模板中添加 slots、props 和 events 的代碼,如下:

<template>
  <vue-markdown :source="markdownText" >
    <template v-slot:pre="">
      <p>這是一個自定義的前置處理。</p>
    </template>
    <template v-slot:code="props">
      <pre :class="'language-' + props.language">{{ props.code }}</pre>
    </template>
    <template v-slot:blockquote="">
      <blockquote>{{ props.content }}</blockquote>
    </template>
  </vue-markdown>
</template> 

2)配置參數(shù)

參數(shù)名稱類型默認值描述
watchesArray["source", "show", "toc"]是否開啟監(jiān)視數(shù)據(jù)變化,自動改變HTML。
sourceStringnull要轉換為 HTML 的 Markdown 字符串。
showBooleantrue是否顯示轉換后的 HTML 內容。
htmlBooleantrue是否允許解析 HTML 標簽。默認為 false。
xhtml-outBooleantrue是否輸出 XHTML 格式。<br></br> => <br />
breaksBooleantrue是否將換行符解析為 <br/> 標簽。\n => <br>
linkifyBooleantrue是否將純文本鏈接轉換為鏈接。
emojiBooleantrue是否支持 emoji 表情。
typographerBooleantrue是否開啟排版選項,例如引號轉換、省略號轉換等。
lang-prefixStringlanguage-語法高亮語言前綴。
quotesString“”‘’引用標記。中文: “”‘’, 德文:„“‚‘ ,俄羅斯: «»„“
table-classStringtable表格的 CSS 類名。
task-listsBooleantrue是否支持任務列表。
tocBooleanfalse是否生成目錄。
toc-idStringundefined生成目錄的Id
toc-classStringtable目錄的 CSS 類名。
toc-first-levelNumber2目錄最頂層標題的級別,取值范圍為 1-6。默認為 2。
toc-last-levelNumber'toc-first-level' + 1目錄最后一層標題的級別,取值范圍為 1-6。默認為5。
toc-anchor-linkBooleantrue在標題中啟用自動錨鏈接
toc-anchor-classStringtoc-anchor自定義錨類名
toc-anchor-link-symbolString#目錄中的錨點鏈接的符號。默認為 ‘#’。
toc-anchor-link-spaceBooleantrue目錄中的錨點鏈接前的空格。
toc-anchor-link-classStringtoc-anchor-link目錄中的錨點鏈接的 CSS 類名。
anchorAttributesObject{}錨點標簽的屬性。: '_blank’orrel: ‘nofollow’`
prerenderFunction (String) Stringnull在轉換 HTML 前的回調函數(shù)。
postrenderFunction (String) Stringnull在轉換 HTML 后的回調函數(shù)。

3)事件

vue-markdown 插件中,提供了以下兩個事件:

方法名稱參數(shù)描述
rendered顯示的html元素(string)渲染結束后觸發(fā)
toc-rendered目錄html元素(string)TOC目錄渲染結束后觸發(fā),如果toc傳的是false則不會觸發(fā)

2、安裝

// npm
npm install vue-markdown
// yarn
yarn add vue-markdown --save

3、使用

<template>
  <div>
    <VueMarkdown :source="markdownText" />
  </div>
</template>

<script>
import VueMarkdown from 'vue-markdown'

export default {
  components: { VueMarkdown },
  data() {
    return {
      markdownText: '# 這是第一個標題!'
    }
  }
}
</script>

二、頁面中渲染并添加目錄

在實際的項目開發(fā)過程中,為了方便定位與查閱,需要目錄大綱,我們可以在旁邊加上一個目錄大綱,這里使用的el-tree進行目錄的展示。

1、HTML部分

<template>
    <div class="page-api" id="myElement">
        <vue-markdown id="content" class="api-content" :source="markdownContent"></vue-markdown>
        <div class="api-tree" id="tree">
            <el-tree :data="tree" :default-expand-all="true" @node-click="handleNodeClick"></el-tree>
        </div>
    </div>
</template>

2、JS部分

import VueMarkdown from 'vue-markdown';
import markdownItAnchor from 'markdown-it-anchor';
import markdownItToc from 'markdown-it-table-of-contents';
import markdownItEmoji from 'markdown-it-emoji';
import markdownItKatex from 'markdown-it-katex';
export default {
	data() {
		return {
			markdown: '# h1 Heading\n ## h2 Heading\n ### h3 Heading',
			markdownContent: '',
			tree: [],
			plugins: [markdownItAnchor, [markdownItToc, { includeLevel: [2, 3] }], markdownItEmoji, markdownItKatex]
		};
	},
	mounted() {
		this.loadMarkdownFile();
	},
	components: {
		VueMarkdown
	},
	methods: {
		async loadMarkdownFile() {
			try {
                //引入在public文件夾下的md文件
				const response = await fetch('/XXXX.md');
				const markdownText = await response.text();
				this.markdownContent = markdownText;
				this.$nextTick(() => {
					this.catalogTree();
				});
			} catch (error) {
				console.error('Failed to load the Markdown file:', error);
			}
		},
		catalogTree() {
			const content = document.getElementById('content').children;
			var arr = [];
			let currentHightestLevel;
			let parentId;
			let index = 0;
			let nodeArr = [];
			let tree = [];
			for (let i = 0; i < content.length; i++) {
				let header = content[i].localName;
				//如果是標題進行下一步
				if (/\b[h][0-9]\b/.test(header)) {
					let ele = content[i]; // 直接使用DOM元素
					let name = ele.textContent; // 獲取元素的文本內容
					ele.setAttribute('id', i); // 設置元素的ID
					
					let id = i;
					if (index === 0 || header <= currentHightestLevel) {
						currentHightestLevel = header;
						parentId = id;
					}
					arr.push({
						id: id,
						label: name,
						parentId: parentId == id ? '0' : parentId
					});
					index++;
				}
			}
			arr.forEach((item) => {
				if (item.parentId === '0') {
					tree.push(this.convertArrayToTree(arr, item));
				}
			});
			this.tree = tree;
		},
		convertArrayToTree(arr, node) {
			for (let i = 0; i < arr.length; i++) {
				if (arr[i].parentId === node.id) {
					const res = this.convertArrayToTree(arr, arr[i]);
					if (node.children) {
						node.children.push(res);
					} else {
						node.children = [res];
					}
				}
			}
			return node;
		},
		handleNodeClick(data) {
			let anchorElement = document.getElementById(data.id);

			let scrollPosition = anchorElement.offsetTop - 20;

			let myElement = document.getElementById('myElement');
			myElement.scrollTo({
				left: 0,
				top: scrollPosition,
				behavior: 'smooth'
			});
		}
	}
};

3、CSS樣式

.page-api {
	display: flex;
	width: 100%;
	height: 100%;
	overflow-y: scroll;
	background-color: #fff;
}
.api-tree {
	position: fixed;
	right: 20px;
	top: 120px;
	width: 250px;
	height: 600px;
	margin-right: 10px;
	overflow-y: scroll;
	/* text-overflow: ellipsis; */
	z-index: 99;
	.el-tree {
		background: none;
		color: #686868;
		.el-tree-node:focus > .el-tree-node__content,
		.el-tree-node__content:hover {
			background: none;
			color: rgb(24, 144, 255);
		}
	}
}
.api-tree::-webkit-scrollbar {
	width: 8px;
}

.api-content {
	flex: 1;
	width: 80%;
	margin-left: 20px;
	margin-right: 220px;
	padding: 0 30px;
	h2 {
		margin-left: 20px;
		margin-bottom: 10px;
	}
	h3 {
		margin-left: 25px;
		margin-bottom: 8px;
	}
	h4 {
		margin-left: 30px;
		margin-bottom: 5px;
	}
	li {
		margin-left: 40px;
	}
	code {
		border-radius: 2px;
		color: #ffaa7f;
		margin: 0 2px;
		padding: 3px 5px;
		white-space: pre-wrap;
	}
	table {
		border-collapse: collapse;
		border-spacing: 0;
		th,
		td {
			border: 1px solid #ddd;
			padding: 6px 13px;
			margin: 0;
		}
	}
	pre {
		background: rgba(0, 0, 0, 0.7);
		padding: 20px 30px;
	}
}
.page-api::-webkit-scrollbar {
	width: 8px;
}
/* 滾動條滑塊樣式 */
.page-api::-webkit-scrollbar-thumb {
	background-color: #888; /* 設置滑塊背景顏色 */
	border-radius: 4px; /* 設置滑塊圓角 */
}

4、效果展示

到此這篇關于使用vue-markdown實現(xiàn)markdown文件預覽的文章就介紹到這了,更多相關vue預覽markdown內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決vue router組件狀態(tài)刷新消失的問題

    解決vue router組件狀態(tài)刷新消失的問題

    這篇文章主要介紹了vue router組件狀態(tài)刷新消失的問題,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • websocket在vue2中的封裝使用方式

    websocket在vue2中的封裝使用方式

    這篇文章主要介紹了websocket在vue2中的封裝使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 使用Vue-cli3.0創(chuàng)建的項目 如何發(fā)布npm包

    使用Vue-cli3.0創(chuàng)建的項目 如何發(fā)布npm包

    這篇文章主要介紹了使用Vue-cli3.0創(chuàng)建的項目,如何發(fā)布npm包,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • vue實現(xiàn)把接口單獨存放在一個文件方式

    vue實現(xiàn)把接口單獨存放在一個文件方式

    這篇文章主要介紹了vue實現(xiàn)把接口單獨存放在一個文件方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue3中同時定義多個插槽的實現(xiàn)示例

    Vue3中同時定義多個插槽的實現(xiàn)示例

    本文主要介紹了Vue3中同時定義多個插槽的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12
  • setup+ref+reactive實現(xiàn)vue3響應式功能

    setup+ref+reactive實現(xiàn)vue3響應式功能

    這篇文章介紹了通過setup+ref+reactive實現(xiàn)vue3響應式功能,文中通過示例代碼介紹的非常詳細。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-11-11
  • vue中同時監(jiān)聽多個參數(shù)的實現(xiàn)

    vue中同時監(jiān)聽多個參數(shù)的實現(xiàn)

    這篇文章主要介紹了vue中同時監(jiān)聽多個參數(shù)的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue打包后dist文件在本地啟動運行的步驟

    vue打包后dist文件在本地啟動運行的步驟

    這篇文章主要給大家介紹了關于vue打包后dist文件在本地啟動運行的簡單步驟,文中通過代碼示例以及圖文介紹的非常詳細,對大家學習或者使用vue具有一定的參考價值,需要的朋友可以參考下
    2023-09-09
  • vue.js實現(xiàn)選項卡切換

    vue.js實現(xiàn)選項卡切換

    這篇文章主要為大家詳細介紹了vue.js實現(xiàn)選項卡切換功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vue實現(xiàn)登錄時滑塊驗證

    vue實現(xiàn)登錄時滑塊驗證

    這篇文章主要為大家詳細介紹了vue實現(xiàn)登錄時滑塊驗證,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

宁海县| 太和县| 司法| 大同县| 阜南县| 红原县| 千阳县| 墨玉县| 临湘市| 苍南县| 札达县| 元江| 时尚| 榕江县| 洛宁县| 呼图壁县| 文山县| 周宁县| 花莲市| 乳山市| 观塘区| 翼城县| 大悟县| 阿合奇县| 滁州市| 瓮安县| 澄江县| 新和县| 恩施市| 洪雅县| 铜川市| 合山市| 桃源县| 名山县| 东光县| 新田县| 新郑市| 铅山县| 财经| 黄山市| 班玛县|