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+vant实现购物车全选和反选功能
Nov 17 Vue.js
解决vue elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
vue3.0实现插件封装
Dec 14 Vue.js
在vue项目中封装echarts的步骤
Dec 25 Vue.js
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
vue 组件基础知识总结
Jan 26 Vue.js
vue监听键盘事件的相关总结
Jan 29 Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
Vue的列表之渲染,排序,过滤详解
Feb 24 Vue.js
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
vue组件vue-esign实现电子签名
Apr 21 Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
Apr 24 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
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
Jquery 常用方法经典总结
2010/01/28 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
jquery对dom的操作常用方法整理
2013/06/25 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
vue.js学习之UI组件开发教程
2017/07/03 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
如何利用Fabric自动化你的任务
2016/10/20 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
HTML文本属性&amp;颜色控制属性的实现
2019/12/17 HTML / CSS
恶意软件的定义
2014/11/12 面试题
物流管理专业大学生自荐信
2013/10/04 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
MySQL去除重叠时间求时间差和的实现
2021/08/23 MySQL