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+iview实现分页及查询功能
Nov 17 Vue.js
vue开发chrome插件,实现获取界面数据和保存到数据库功能
Dec 01 Vue.js
vue3.0中setup使用(两种用法)
Dec 02 Vue.js
用vue设计一个日历表
Dec 03 Vue.js
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
vue backtop组件的实现完整代码
Apr 07 Vue.js
Vue实现跑马灯样式文字横向滚动
Nov 23 Vue.js
vue数据字典取键值项目的字典问题
Apr 12 Vue.js
el-table-column 内容不自动换行的解决方法
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
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
符合W3C网页标准的iframe标签的使用方法
2007/07/19 Javascript
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
Vue 源码分析之 Observer实现过程
2018/03/29 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
2019/07/06 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
python中bisect模块用法实例
2014/09/25 Python
介绍Python中的fabs()方法的使用
2015/05/14 Python
python删除过期文件的方法
2015/05/29 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
一些.net面试题
2014/10/06 面试题
运动会广播稿300字
2014/01/10 职场文书
检讨书范文300字
2015/01/28 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
导游词之清晏园
2019/11/22 职场文书
python实现三次密码验证的示例
2021/04/29 Python
基于Python实现nc批量转tif格式
2022/08/14 Python