zoukankan      html  css  js  c++  java
  • Vue+highligh.js实现语法高亮(转)

    前言

    • 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的基本原理

    • 从官方用法可知,在使用前要引入CSS,highlight.js文件然后通过hljs.initHighlightingOnLoad()方法进行渲染;下面介绍两个重要的方法,initHighlightingOnLoad()initHighlighting()
    • initHighlighting():主要是获取页面中的pre,code标签,按照特定的规则为其添加样式,只执行一次。
    • //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

    • 问题使用:这样使用会在页面渲染的时候会出现高亮效果,但是这导致的问题是,切换路由的时候代码高亮会消失。之所以产生这种现象,这跟 hljs.initHighlightingOnLoad()的定义有关,因为只执行一次。
    • 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()
        }    
      }
    我自横刀向天笑,哈哈哈哈哈哈哈!
  • 相关阅读:
    Qt中修改QtoolTip的样式
    字符编码笔记:ASCII、Unicode和UTF-8
    UML类图关系模式(C++代码说明)
    sql标签和include标签的使用
    mybatis动态SQL标签的用法
    <!CDATA[ ....... ]] > 用法详解
    Mybatis 中$与#的区别
    枚举
    ExtJs如何判断form表单是否被修改过详解
    Extjs二级联动combo省城市
  • 原文地址:https://www.cnblogs.com/yinian/p/9935336.html
Copyright © 2011-2022 走看看