前言css
highlight
官方用法以下:前端
<link rel="stylesheet" href="/path/to/styles/default.css"> <script src="/path/to/highlight.pack.js"></script> <script>hljs.initHighlightingOnLoad();</script>
vue
开发的时候,不少人遇到如何使用的问题,一种方案是用过指令来实现,例如这篇文章介绍的https://segmentfault.com/a/11...;1.
highlight.js
的基本原理vue
CSS
,highlight.js
文件而后经过hljs.initHighlightingOnLoad()
方法进行渲染;下面介绍两个重要的方法,initHighlightingOnLoad()
和initHighlighting()
initHighlighting()
:主要是获取页面中的pre,code
标签,按照特定的规则为其添加样式,只执行一次。segmentfault
//hightlight.js源码 function initHighlighting() { if (initHighlighting.called) return; //若是被执行过,则返回,说明只执行一次 initHighlighting.called = true;//标记执行过 var blocks = document.querySelectorAll('pre code');//获取页面全部 pre ,code 标签 ArrayProto.forEach.call(blocks, highlightBlock);}//经过highlight.js的规则添加样式
initHighlightingOnLoad()
:监听页面加载事件,调用initHighlighting()
服务器
//hightlight.js源码 function initHighlightingOnLoad() { addEventListener('DOMContentLoaded', initHighlighting, false); addEventListener('load', initHighlighting, false); }
2.
vue
+highligh.js
google
问题使用:这样使用会在页面渲染的时候会出现高亮效果,可是这致使的问题是,切换路由的时候代码高亮会消失。之因此产生这种现象,这跟 hljs.initHighlightingOnLoad()
的定义有关,由于只执行一次。code
import hljs from 'highlight.js' export default { mounted(){ hljs.initHighlightingOnLoad() } }
解决方法:能够重写 hljs.initHighlighting()
方法,在组件的中是使用 hljs.highlightCode()
,每次页面加载的时候都会执行渲染代码的逻辑。事件
//在main.js中 import 'highlight.js/styles/googlecode.css' import hljs from 'highlight.js' hljs.highlightCode = function () { //自定义highlightCode方法,将只执行一次的逻辑去掉 let blocks = document.querySelectorAll('pre code'); [].forEach.call(blocks, hljs.highlightBlock); }; //在组件中 export default { mounted(){ hljs.highlightCode() } }