使用Vue指令實(shí)現(xiàn)Markdown渲染和代碼高亮
在前端開(kāi)發(fā)中,我們經(jīng)常需要將Markdown格式的文本渲染成HTML并展示在頁(yè)面上,同時(shí)還希望能夠?qū)Υa塊進(jìn)行高亮顯示。今天我將分享一段代碼,通過(guò)Vue指令實(shí)現(xiàn)了這個(gè)功能。
首先,你需要安裝一些依賴。在你的項(xiàng)目中執(zhí)行以下命令:
pnpm add highlight.js marked @types/marked -D
接下來(lái),我們來(lái)看一下具體的代碼實(shí)現(xiàn)。
在main.ts
文件中,我們需要注冊(cè)一個(gè)全局的Vue指令。代碼如下:
import { markedDirective } from './path/to/markedDirective' app.directive('marked', markedDirective)
在Vue組件中,你可以使用v-marked
指令來(lái)渲染Markdown文本,并對(duì)代碼塊進(jìn)行高亮顯示。示例代碼如下:
<template> <div v-marked:hl="code"></div> </template> <script setup lang="ts"> import 'highlight.js/styles/atom-one-dark.css' import code from '@/config/code.md?raw' </script>
上面的示例代碼中,我們導(dǎo)入了highlight.js
的樣式文件,并且使用code.md
文件中的Markdown文本作為示例。
接下來(lái),讓我們來(lái)看一下具體的實(shí)現(xiàn)代碼。
首先,我們需要導(dǎo)入highlight.js
和marked
模塊,代碼如下:
import hljs from 'highlight.js' import { marked } from 'marked' import { Directive, DirectiveHook, nextTick } from 'vue'
然后,我們需要?jiǎng)?chuàng)建一個(gè)marked
的渲染器,并設(shè)置一些選項(xiàng),代碼如下:
const render = new marked.Renderer() marked.setOptions({ renderer: render, gfm: true, pedantic: false })
在Vue指令的具體實(shí)現(xiàn)中,我們定義了一個(gè)formatValue
函數(shù),該函數(shù)用于將Markdown文本渲染成HTML,并對(duì)代碼塊進(jìn)行高亮顯示。代碼如下:
const formatValue: DirectiveHook = async (el, binding) => { const html = marked(binding?.value ?? '') el.innerHTML = html await nextTick() if (binding.arg === 'hl') { const blocks = el.querySelectorAll('pre code') blocks.forEach((block: any) => { hljs.highlightBlock(block) }) } }
最后,我們將formatValue
函數(shù)作為Vue指令的mounted
和updated
鉤子的回調(diào)函數(shù)。這樣,每當(dāng)指令所綁定的值發(fā)生變化時(shí),都會(huì)重新渲染Markdown文本并對(duì)代碼塊進(jìn)行高亮顯示。代碼如下:
export const markedDirective: Directive = { mounted: formatValue, updated: formatValue }
到此為止,我們已經(jīng)完成了整個(gè)功能的實(shí)現(xiàn)。
總結(jié)一下,通過(guò)上述代碼,我們可以在Vue項(xiàng)目中使用v-marked
指令將Markdown文本渲染成HTML,并對(duì)其中的代碼塊進(jìn)行高亮顯示。這對(duì)于展示文檔、博客等場(chǎng)景非常有用。
以上就是使用Vue指令實(shí)現(xiàn)Markdown渲染和代碼高亮的詳細(xì)內(nèi)容,更多關(guān)于Vue Markdown渲染和代碼高亮的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue實(shí)現(xiàn)的仿淘寶購(gòu)物車功能詳解
這篇文章主要介紹了vue實(shí)現(xiàn)的仿淘寶購(gòu)物車功能,結(jié)合完整實(shí)例形式較為詳細(xì)的分析了vue.js仿淘寶購(gòu)物車功能的具體樣式、功能相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-01-01基于腳手架創(chuàng)建Vue項(xiàng)目實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了基于腳手架創(chuàng)建Vue項(xiàng)目實(shí)現(xiàn)步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08快速解決Vue項(xiàng)目在IE瀏覽器中顯示空白的問(wèn)題
今天小編就為大家分享一篇快速解決Vue項(xiàng)目在IE瀏覽器中顯示空白的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09Vue純前端如何實(shí)現(xiàn)導(dǎo)出簡(jiǎn)單Excel表格的功能
這篇文章主要介紹了如何在Vue項(xiàng)目中使用vue-json-excel插件實(shí)現(xiàn)Excel表格的導(dǎo)出功能,包括安裝依賴、引入插件、使用組件、設(shè)置表頭和數(shù)據(jù)、處理空數(shù)據(jù)情況、源代碼修改以解決常見(jiàn)問(wèn)題,需要的朋友可以參考下2025-01-01vue父組件傳值子組件報(bào)錯(cuò)Avoid?mutating?a?prop?directly解決
這篇文章主要為大家介紹了vue父組件傳值子組件報(bào)錯(cuò)Avoid?mutating?a?prop?directly解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09在vue項(xiàng)目中引入highcharts圖表的方法(詳解)
下面小編就為大家分享一篇在vue項(xiàng)目中引入highcharts圖表的方法(詳解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助2018-03-03Vue封裝一個(gè)TodoList的案例與瀏覽器本地緩存的應(yīng)用實(shí)現(xiàn)
這篇文章主要介紹了Vue封裝一個(gè)TodoList的案例與瀏覽器本地緩存的應(yīng)用實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04vue-resource 攔截器interceptors使用詳解
這篇文章主要介紹了vue-resource 攔截器interceptors使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01