实现步骤
1.新建一个组件
这个简单就不详细说,只要定义好一个div,class命名为markdown-body就好,至于为什么是这个,后面再说。
<template>
<div class="markdown-body">
</div>
</template>
<script>
export default {
name: "MyMarkdown",
data() {
return {
md: ""
};
}
</script>
<style>
.markdown-body {
box-sizing: border-box;
margin: 0 auto;
padding: 0 40px;
}
</style>
2. 获取Markdown文件
首先需要考虑一个问题,既然想把Markdown文档渲染成组件,那Markdown文件从哪里来?
方法很多,我就说两种:
静态资源导入
像外部css文件一样导入,需要使用loader,可以看一下 markdown-loader,我没有使用这个方法,就不细说了,感兴趣的同学,自己了解一下。
远程获取
比如从静态资源服务器、后端服务器等远程服务器获取。
我为什么要选择这种方法呢?
我主要考虑到,README.md不是一成不变的,我可能随时需要修改。如果使用第一种方法,每次修改都需要对项目重新build,然后重新部署,很麻烦。但使用第二种方法,文件修改了,只需要把文件重新上传到服务器就可以了,服务器都不需要重启。
我的后端服务器在之前就已经实现静态资源请求的处理,你在在线Demo中看到的图片,绝大部分都是从后端服务器获取来的。所以我现在只需要在后端服务器的public文件夹下新建一个docs文件夹,然后把README.md放进去。前端在组件创建完成后,使用axios向后端发起请求,就能获取到README.md。
代码:
created() {
// 从后端请求README.md
this.$axios
.get("/api/public/docs/README.md", {})
.then(res => {
this.md = res.data;
})
.catch(err => {
return Promise.reject(err);
});
}
先在控制台输出看一下获取回来的数据是怎样的
这个是不是很熟悉,就是README.md源文件,那如何渲染到组件呢?
3. 把Markdown文档渲染成html
Markdown文档拿到了,那怎样把它渲染到页面呢,v-html吗?显然不行,我找到了 vue-markdown ,一个 Markdown解析器,可以把Markdown文档解析成html。
安装
npm install --save vue-markdown
导入
import VueMarkdown from "vue-markdown";
局部注册组件
components: {
VueMarkdown
}
使用
<div id="my-markdown" class="markdown-body">
<vue-markdown :source="md"></vue-markdown>
</div>
效果
先看一下效果
是不是觉得有点丑,不急,没有css样式,当然是有点丑。
4. CSS样式
css样式从哪里?自己写吗,当然不啦,作为一名优秀的**,有现成的,绝不自己写,于是我找到了 github-markdown-css ,为了使用方便,我直接下载下来,放在“../assets/css/”目录下,然后导入。
@import "../assets/css/github-markdown.css";
然而,事情并没有像想象的那么美好,页面什么都没有改变。
我看了一下github-markdown-css的文档,才知道要在父div添加class:markdown-body,至于为什么,大家应该都懂,就不说了。
看一下效果吧
总结
到这里,把Markdown文档渲染成Vue组件的需求已经实现,需求很简单,实现也很简单,没有什么技术含量,就当学习的过程分享一下吧。