最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue中實(shí)現(xiàn)Monaco Editor自定義提示功能

 更新時(shí)間:2019年07月05日 14:27:19   作者:豬九咩  
最近小編接到一個(gè)項(xiàng)目,需要在瀏覽器的ide中支持自定義提示功能,接下來通過本文給大家介紹在vue中實(shí)現(xiàn)Monaco Editor自定義提示功能,需要的朋友可以參考下

這次接到一個(gè)需求,要在瀏覽器的 IDE 中支持自定義提示功能,如下所示:

可以看到,它可以根據(jù)用戶輸入的內(nèi)容來一項(xiàng)一項(xiàng)排除,只顯示完全匹配的那一項(xiàng)。

項(xiàng)目的框架是 Vue ,編輯器用的是 Monaco Editor 。

什么是 Monaco Editor

vscode 是我們經(jīng)常在用的編輯器,它的前身是微軟的一個(gè)叫 Monaco Workbench 的項(xiàng)目,而 Monaco Editor 就是從這個(gè)項(xiàng)目中成長出來的一個(gè) web 編輯器,他們很大一部分的代碼都是共用的,所以 Monaco EditorVSCode 在編輯代碼,交互及 UI 上幾乎是一摸一樣的。不同的是,兩者的平臺(tái)不一樣, Monaco Editor 基于瀏覽器,而 VSCode 基于 electron ,所以功能上 VSCode 更加健全,性能比較強(qiáng)大。

用法

安裝

npm install monaco-editor --save

使用

<div id="monaco" class="monaco-editor"></div>
import * as monaco from 'monaco-editor';
this.fileEditor = this.monaco.editor.create(document.getElementById('monaco'), {
 value: null,
 language: 'sql' // 這里以sql為例
})

this.fileEditor.dispose(); // 使用完后銷毀

這里引入 monaco 要注意,在 react 中以下面方式引入:

import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';

實(shí)現(xiàn)自定義提示功能

查看了資料后,發(fā)現(xiàn)在 monaco 中有提供一個(gè)提示功能的方法 registerCompletionItemProvider ,具體實(shí)現(xiàn)如下:

this.monaco.languages.registerCompletionItemProvider('sql', { // 這里以sql語言為例
 provideCompletionItems () {
  return [{
   label: '${_DB', // 顯示的提示內(nèi)容
   kind: this.monaco.languages.CompletionItemKind['Function'], // 用來顯示提示內(nèi)容后的不同的圖標(biāo)
   insertText: '{_DB', // 選擇后粘貼到編輯器中的文字
   detail: '' // 提示內(nèi)容后的說明
  }];
 },
 triggerCharacters: ['$'] // 觸發(fā)提示的字符,可以寫多個(gè)
});

以上的用法,我試了一下之后發(fā)現(xiàn),雖然 triggerCharacters 的值是數(shù)組,可以有多個(gè),但是里面的字符串只能識別一個(gè)字符。一開始的需求是輸入 ${_ 之后提示 ${_DB ,但是由于不能識別多個(gè)字符,只能做到出現(xiàn) $ 就提示。

還有一個(gè)問題就是 registerCompletionItemProvider 的第一個(gè)參數(shù)只能是字符串,如果有多種語言只能疊加重復(fù)寫,恰巧我的需求是有多種語言,所以只能如下解決,也就是每種語言都寫了一遍:

['json', 'yaml', 'php', 'go', 'sql', 'java', 'markdown', 'plaintext'].map(item => {
 this.monaco.languages.registerCompletionItemProvider(item, {
  provideCompletionItems () {
   return [{
    label: '${_DB',
    kind: this.monaco.languages.CompletionItemKind['Function'],
    insertText: '{_DB',
    detail: ''
   }];
  },
  triggerCharacters: ['$']
 });
});

需求是 ${_DB:key:value ,也就是說在輸入 ${_DB 后,再輸入一個(gè) : 提示出 key ,在 key 之后輸入 : 提示 value

這里又碰到一個(gè)問題,需要知道當(dāng)前輸入的內(nèi)容來判斷是 $ 還是 : ,而且后面兩個(gè)觸發(fā)提示的符號同是 : ,無法區(qū)分,只能通過識別 : 的位置來判斷是提示 key 還是 value ,所以還要知道當(dāng)前輸入的 : 之前的內(nèi)容。

那么只有在 provideCompletionItems 這一步判斷,但是查遍了資料沒有發(fā)現(xiàn)這樣的參數(shù), provideCompletionItems 只有 model 、 position 、 token 這幾個(gè)參數(shù),后來發(fā)現(xiàn) model 中的 getLineContent 方法可以獲取指定行的所有內(nèi)容,而 position 可以獲取當(dāng)前輸入行的行數(shù)和列數(shù),于是就有了以下解決方法:

this.monaco.languages.registerCompletionItemProvider(item, {
 provideCompletionItems (model, position) {
  // 獲取當(dāng)前行數(shù)
  const line = position.lineNumber
  
  // 獲取當(dāng)前列數(shù)
  const column = position.column
  
  // 獲取當(dāng)前輸入行的所有內(nèi)容
  const content = model.getLineContent(line)
  
  // 通過下標(biāo)來獲取當(dāng)前光標(biāo)后一個(gè)內(nèi)容,即為剛輸入的內(nèi)容
  const sym = content[column - 2]
  
  if (sym === '$') {
   return [{
    label: '${_DB',
    kind: this.monaco.languages.CompletionItemKind['Function'],
    insertText: '{_DB',
    detail: ''
   }];
  }
  
  return [{
   label: ':abb',
   kind: this.monaco.languages.CompletionItemKind['Function'],
   insertText: 'abb',
   detail: ''
  },
  {
   label: ':bc',
   kind: this.monaco.languages.CompletionItemKind['Function'],
   insertText: 'bc',
   detail: ''
  }];
 },
 triggerCharacters: ['$', ':']
});

能獲取光標(biāo)后的第一個(gè)內(nèi)容,后面的內(nèi)容就都能獲取啦,如果識別到前面的內(nèi)容是 ${_DB 就提示 key ,否則提示 value

最后總結(jié)下來就是一定要多看文檔,勤于測試就能解決問題啦~

總結(jié)

以上所述是小編給大家介紹的vue中實(shí)現(xiàn)Monaco Editor自定義提示功能 ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • Vue.js原理分析之nextTick實(shí)現(xiàn)詳解

    Vue.js原理分析之nextTick實(shí)現(xiàn)詳解

    這篇文章主要給大家介紹了關(guān)于Vue.js原理分析之nextTick實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 微前端qiankun主應(yīng)用與子應(yīng)用之間的跳轉(zhuǎn)示例

    微前端qiankun主應(yīng)用與子應(yīng)用之間的跳轉(zhuǎn)示例

    這篇文章主要為大家介紹了微前端qiankun主應(yīng)用與子應(yīng)用之間的跳轉(zhuǎn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • vue中component組件的props使用詳解

    vue中component組件的props使用詳解

    本篇文章主要介紹了vue中component組件的props使用詳解,這里整理了詳細(xì)的用法,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-09-09
  • 關(guān)于vue中使用three.js報(bào)錯(cuò)的解決方法

    關(guān)于vue中使用three.js報(bào)錯(cuò)的解決方法

    最近因?yàn)閠hree.js的項(xiàng)目要用Vue.js,下面這篇文章主要給大家介紹了關(guān)于vue中使用three.js報(bào)錯(cuò)的解決方法,文中通過圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • Vue proxyTable配置多個(gè)接口地址,解決跨域的問題

    Vue proxyTable配置多個(gè)接口地址,解決跨域的問題

    這篇文章主要介紹了Vue proxyTable配置多個(gè)接口地址,解決跨域的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue實(shí)現(xiàn)表單未編輯或未保存離開彈窗提示功能

    vue實(shí)現(xiàn)表單未編輯或未保存離開彈窗提示功能

    這篇文章主要介紹了vue實(shí)現(xiàn)表單未編輯或未保存離開彈窗提示功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Vue.js學(xué)習(xí)記錄之在元素與template中使用v-if指令實(shí)例

    Vue.js學(xué)習(xí)記錄之在元素與template中使用v-if指令實(shí)例

    這篇文章主要給大家介紹了關(guān)于Vue.js學(xué)習(xí)記錄之在元素與template中使用v-if指令的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),相信對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • Vue中使用JsonView來展示Json樹的實(shí)例代碼

    Vue中使用JsonView來展示Json樹的實(shí)例代碼

    這篇文章主要介紹了Vue之使用JsonView來展示Json樹的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Vue 2.0中生命周期與鉤子函數(shù)的一些理解

    Vue 2.0中生命周期與鉤子函數(shù)的一些理解

    這篇文章主要給大家介紹了關(guān)于Vue 2.0中生命周期與鉤子函數(shù)的相關(guān)資料,對大家學(xué)習(xí)或者使用vue2.0具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨小編一起來看看吧。
    2017-05-05
  • Vue axios獲取token臨時(shí)令牌封裝案例

    Vue axios獲取token臨時(shí)令牌封裝案例

    這篇文章主要介紹了Vue axios獲取token臨時(shí)令牌封裝案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

桑日县| 垣曲县| 岫岩| 瑞丽市| 兴安县| 上虞市| 车致| 宕昌县| 罗山县| 永修县| 英吉沙县| 和平区| 宜黄县| 丹棱县| 襄垣县| 宣城市| 怀安县| 兰坪| 上蔡县| 无锡市| 江北区| 平利县| 疏附县| 福清市| 河池市| 德钦县| 乌鲁木齐市| 铜山县| 安义县| 石景山区| 乌拉特中旗| 宁武县| 太白县| 东光县| 卫辉市| 津市市| 中超| 安福县| 民权县| 谢通门县| 清水河县|