vue中封装使用markdown并语法高亮

最近学习Vue2.0,感觉很有意思,给大家分享一个在vue项目中写markdown的方法。国际惯例,先附上一些链接。

安装依赖包

1
2
npm install -S marked
npm install -S highlight.js

vue中注册自定义指令

main.js:

1
2
3
import Vue from 'vue'
import Marked from './common/directive/marked.js'
Vue.use(Marked);

ps:Vue.use()会自动调用参数文件里的install()

marked.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import marked from 'marked';
import 'highlight.js/styles/monokai-sublime.css';//这个样式有多种类型可选择


marked.setOptions({
renderer: new marked.Renderer(),
gfm: true,
tables: true,
breaks: false,
pedantic: false,
sanitize: false,
smartLists: true,
smartypants: false,
highlight: function (code) {
return require('highlight.js').highlightAuto(code).value;
}
});


let install = function(Vue){
/* istanbul ignore if */
if (install.installed) return;
Vue.directive('marked',{
//注意,这儿得使用bind钩子函数,因为我们使用此指令主要是为了写文档,
//文档里不会有变量且一次性生成,而update在自定义指令所在模板变化时就会重新执行,
//会影响渲染文档的方法,所以不能使用update钩子,也不能使用函数简写
bind:function(el,binding,vnode){
el.innerHTML = marked(el.innerText);
}
})
}

export default install;

使用自定义指令:v-marked

里面的缩进和空格也是markdown语法的一部分
vue mark
结果:
vue mark result

ps:
代码语法高亮的样式可以有多种选择:
highlight style

vue自定义指令相关知识

钩子函数

指令定义函数提供了几个钩子函数(可选):

  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
钩子函数的参数
  • el: 指令所绑定的元素,可以用来直接操作 DOM
  • binding: 一个对象,包含以下属性:
    • name: 指令名,不包括 v- 前缀。
    • value: 指令的绑定值, 例如: v-my-directive="1 + 1", value 的值是 2。
    • oldValue: 指令绑定的前一个值,仅在 updatecomponentUpdated 钩子中可用。无论值是否改变都可用。
    • expression: 绑定值的字符串形式。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"
    • arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 "foo"
    • modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }
  • vnode: Vue 编译生成的虚拟节点,查阅 VNode API 了解更多详情。
  • oldVnode: 上一个虚拟节点,仅在 updatecomponentUpdated 钩子中可用。
函数简写

大多数情况下,我们可能想在 bindupdate 钩子上做重复动作,并且不想关心其它的钩子函数。可以这样写:

1
2
3
4
//首先bind的时候执行一次,再多次执行update
Vue.directive('color-swatch', function (el, binding) {
el.style.backgroundColor = binding.value
})

堂 wechat
欢迎关注我的微信公众号,里面有各种小故事哦!
坚持原创技术分享,您的支持将鼓励我继续创作!