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-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
详解Vue中的自定义指令
Dec 07 Vue.js
vue 实现基础组件的自动化全局注册
Dec 25 Vue.js
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
关于vue中如何监听数组变化
Apr 28 Vue.js
vue如何批量引入组件、注册和使用详解
May 12 Vue.js
vue-cli4.5.x快速搭建项目
May 30 Vue.js
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
vue判断按钮是否可以点击
Apr 09 Vue.js
vue 自定义的组件绑定点击事件
Apr 21 Vue.js
vue生命周期钩子函数以及触发时机
Apr 26 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写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
求解开jscript.encode代码的asp函数
2007/02/28 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
JavaScript脚本库编写的方法
2015/12/09 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
WxPython建立批量录入框窗口
2019/02/27 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
css3 media 响应式布局的简单实例
2016/08/03 HTML / CSS
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
NBA欧洲商店(西班牙):NBA Europe Store ES
2019/04/16 全球购物
简历中自我评价范文3则
2013/12/14 职场文书
甜品店的创业计划书范文
2014/01/02 职场文书
公司同意接收函
2014/01/13 职场文书
安全生产责任书
2014/03/12 职场文书
继承公证书
2014/04/09 职场文书
安全生产月活动总结
2014/05/04 职场文书
高一新生军训方案
2014/05/12 职场文书
2014年底工作总结
2014/12/15 职场文书
优秀党员事迹材料
2014/12/18 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android