Vue单页面应用中实现Markdown渲染


Posted in Vue.js onFebruary 14, 2021

之前渲染 Markdown 的时候, 笔者使用的是 mavonEditor 的预览模式, 使用起来比较爽, 只需要引入组件即可, 但是在最近的开发中, 遇到了困难.

主要问题在于作为单页面应用, 站内链接必须是使用 router-link 跳转, 如果使用 mavonEditor 默认渲染的 a 标签, 就会重新加载页面, 用户体验较差.

动态渲染

想要实现在前端动态地根据用户内容渲染router-link , 需要使用动态渲染, 根据 官方文档, 直接修改vue.config.js 即可:

// vue.config.js
module.exports = {
 runtimeCompiler: true
}

渲染 Markdown

笔者使用的是 markdown-it, 配置过程如下:

安装

npm install markdown-it --save # 本体
npm install markdown-it-highlightjs --save # 代码高亮
npm install markdown-it-katex --save # latex 支持

这里还另外安装了两个语法插件, 如果有其他需要的话, 可以在 npm 上搜索

静态文件导入

highlight.js
通过 cdn 导入, 在 index.html 中加入:

<link rel="stylesheet" href="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.5.0/build/styles/default.min.css" rel="external nofollow" >
<script src="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.5.0/build/highlight.min.js"></script>

github-markdown-css

markdown 的样式

安装

npm install github-markdown-css --save

导入

在 main.js 文件中添加

import 'github-markdown-css/github-markdown.css'

katex

通过 cdn 导入, 在 index.html 中加入:

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.5.1/katex.min.css" rel="external nofollow" >

使用

首先在 components 目录下创建 Markdown.vue 文件,

<template>
 <components :is="html" class="markdown-body"></components>
</template>

<script>
import MarkdownIt from 'markdown-it'
import hljs from 'markdown-it-highlightjs'
import latex from 'markdown-it-katex'
export default {
 name: 'Markdown',
 props: {
  content: String
 },
 data: () => ({
  md: null
 }),
 computed: {
  // 使用 computed 才能在动态绑定时动态更新
  html: function () {
   let res = this.md.render(this.content)
   // 使用正则表达式将站内链接替换为 router-link 标签
   res = res.replace(/<a href="(?!http:\/\/|https:\/\/)(.*?)" rel="external nofollow" >(.*?)<\/a>/g, '<router-link to="$1">$2</router-link>')
   // 使用正则表达式将站外链接在新窗口中打开
   res = res.replace(/<a href="(.*?)" rel="external nofollow" >(.*?)<\/a>/g, '<a href="$1" rel="external nofollow" target="_blank">$2</a>')
   return {
    template: '<div>' + res + '</div>'
   }
  }
 },
 created () {
  this.md = new MarkdownIt()
  this.md.use(hljs).use(latex)
 }
}
</script>

然后在想使用的地方导入即可

<template>
  <div>
    <Markdown :content="content"/>
  </div>
</template>

<script>
import Markdown from '@/components/Markdown.vue'
export default {
 name: 'Home',
 components: {
  Markdown
 },
 data: () => ({
  content: ''
 }),
 created () {
  this.content = '# 测试'
 }
}
</script>

以上就是Vue单页面应用中实现Markdown渲染的详细内容,更多关于vue Markdown渲染的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
在Vue中使用mockjs代码实例
Nov 25 Vue.js
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
Vue如何跨组件传递Slot的实现
Dec 14 Vue.js
vue3弹出层V3Popup实例详解
Jan 04 Vue.js
vue二选一tab栏切换新做法实现
Jan 19 Vue.js
Vue 数据响应式相关总结
Jan 28 Vue.js
Vue 事件的$event参数=事件的值案例
Jan 29 Vue.js
如何在 Vue 中使用 JSX
Feb 14 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
深入讲解Vue中父子组件通信与事件触发
Mar 22 Vue.js
vue/cli 配置动态代理无需重启服务的方法
May 20 Vue.js
vue实现简易音乐播放器
Aug 14 Vue.js
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 #Vue.js
Vue+Bootstrap实现简易学生管理系统
Feb 09 #Vue.js
详解Vue的七种传值方式
Feb 08 #Vue.js
Vue中使用wangeditor富文本编辑的问题
Feb 07 #Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 #Vue.js
vue如何使用rem适配
Feb 06 #Vue.js
如何管理Vue中的缓存页面
Feb 06 #Vue.js
You might like
PHP 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
PHP定时执行计划任务的多种方法小结
2011/12/19 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
Python 加密的实例详解
2017/10/09 Python
python实现k-means聚类算法
2018/02/23 Python
python实现图书管理系统
2018/03/12 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
利用Python的sympy包求解一元三次方程示例
2019/11/22 Python
PyCharm 2020.2 安装详细教程
2020/09/25 Python
python获取本周、上周、本月、上月及本季的时间代码实例
2020/09/08 Python
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
英国豪华文具和皮具配件经典老品牌:Smythson(斯迈森)
2018/04/19 全球购物
财务管理职业生涯规划范文
2013/12/27 职场文书
汽车销售顾问求职自荐信
2014/01/01 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
课堂打架检讨书200字
2014/11/21 职场文书
品质保证书格式
2015/02/28 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis