欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue3造輪子之Typescript配置highlight過(guò)程

 更新時(shí)間:2024年07月05日 10:29:20   作者:存梨  
這篇文章主要介紹了Vue3造輪子之Typescript配置highlight過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

項(xiàng)目基礎(chǔ)是 vue3+typescript 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 UI 組件庫(kù)。

在編寫組件介紹文檔時(shí),需要提供一些代碼示例,這時(shí)候用到了 hightlight.js 來(lái)實(shí)現(xiàn)代碼的高亮。

一、安裝 highlight.js

執(zhí)行命令行進(jìn)行依賴以及類型聲明的安裝

yarn add highlight.js @types/highlight.js

安裝完成后,按照官方地址配置發(fā)現(xiàn)是無(wú)法使用的,報(bào)錯(cuò)情況如下

這個(gè)問(wèn)題說(shuō)明我們引入的類并沒(méi)有 vuePlugin 這個(gè)屬性

二、增加 highlight.ts 文件

那么我們基于 typescript 來(lái)使用 highlight.js 的話,就需要解決這個(gè) vue.use() 的問(wèn)題。

查閱資料得知,需要增加一個(gè)定義 vue 外部插件的 highlight.ts

如下所示,可放心復(fù)制

import Hljs from 'highlight.js';
import 'highlight.js/styles/monokai-sublime.css'
// 自定義的interface會(huì)導(dǎo)致報(bào)錯(cuò)
// interface Highlightjs {
//    [x:string]:any
// }
//let Highlight:Highlightjs = {};
let Highlight:any = {};

Highlight.install = function (Vue:any,options:any) {

    Vue.directive('highlightA',{
        inserted:function(el:any){
            let blocks = el.querySelectorAll('per code');
            for (let i = 0; i < blocks.length; i++) {
                const item = blocks[i]
                Hljs.highlightBlock(item)
            }
        }
    })

    Vue.directive('highlightB',{
        componentUpdated:function(el:any){
            let blocks = el.querySelectorAll('per code');
            for (let i = 0; i < blocks.length; i++) {
                const item = blocks[i]
                Hljs.highlightBlock(item)
            }
        }
    })
}

export default Highlight

在這里曾嘗試定義一個(gè) Highlightjs 的接口類型,但是會(huì)導(dǎo)致報(bào)如下的錯(cuò)誤,而放棄

初步分析該報(bào)錯(cuò)的原因是 interface 里的類型定義還是存在一定的問(wèn)題,所以用了 any 類型暴力解決了。

三、在入口文件引入

定義好 highlight.ts 文件后,在我們的入口文件 main.ts 中引入即可

下面的代碼可放心復(fù)制

import { createApp } from 'vue'
import router from './router'
import App from './App.vue'
import Highlight from './libs/types/highlight' // 路徑對(duì)應(yīng)你創(chuàng)建的highlight.ts的路徑

const app = createApp(App)
app.use(router)
app.use(Highlight)
app.mount('#app')

到此,我們就可以在 ts 文件中正常的引入 hightlight.js 并開(kāi)始使用了。

個(gè)人測(cè)試驗(yàn)證第二、第三步不可行,以下是更正后的方法

四、在入口文件注冊(cè)指令

安裝好 highlight.js 之后,我們?cè)谌肟谖募?cè) vue 的自定義指令 directive

代碼如下

import { createApp } from 'vue'
import router from './router'
import App from './App.vue'
import hljs from 'highlight.js'
import 'highlight.js/styles/monokai-sublime.css'

const app = createApp(App)
app.use(router)

// 注冊(cè)自定義指令高亮代碼
app.directive('highlight', {
  // Directive has a set of lifecycle hooks:
  // called before bound element's parent component is mounted
  beforeMount(el:any) {
    // on first bind, highlight all targets
    let blocks = el.querySelectorAll('pre code');
    for(let i = 0 ;i < blocks.length ; i++){
      let item = blocks[i]
      console.log(item)
      hljs.highlightBlock(item)
    }
  },
  // called after the containing component's VNode and the VNodes of its children // have updated
  updated(el:any, binding:any) {
    // after an update, re-fill the content and then highlight
    let targets = el.querySelectorAll('code');
    for (let i = 0; i < targets.length; i += 1) {
        let target = targets[i];
        if (typeof binding.value === 'string') {
        target.textContent = binding.value;
        }
        hljs.highlightBlock(target);
    }
  }
})

app.mount('#app')

這樣我們?cè)诮M件中可以通過(guò)指令進(jìn)行代碼高亮的編寫了,示例如下

<pre v-highlight>
  <code class="javascript">
    let a = "hello world";
    console.log(a)
  </code>
</pre>

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論