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

vue 使用monaco實(shí)現(xiàn)代碼高亮

 更新時(shí)間:2021年03月05日 09:42:21   作者:lgx211  
這篇文章主要介紹了vue 使用monaco實(shí)現(xiàn)代碼高亮的方法,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下

使用的是vue語(yǔ)言,用element的組件,要做一個(gè)在線編輯代碼,要求輸入代碼內(nèi)容,可以進(jìn)行高亮展示,可以切換各不同語(yǔ)言,而且支持關(guān)鍵字補(bǔ)全,還要有一個(gè)各不同版本間的代碼左右比較,這就是需求。

至于為什么選中monaco,請(qǐng)查看 vue(element)中代碼高亮插件全面對(duì)比

好了,現(xiàn)在正式開(kāi)工吧!

首先需要下載monaco-editor組件,monaco-editor-webpack-plugin組件

npm install monaco-editor
npm install monaco-editor-webpack-plugin

當(dāng)然啦,npm下載很是緩慢,換個(gè)國(guó)內(nèi)鏡像,淘寶的吧。果然,速度就嗖嗖的起來(lái)。

npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install

cnpm install monaco-editor
cnpm install monaco-editor-webpack-plugin

可在node_modules下看到其目錄結(jié)構(gòu)

核心代碼如下所示

首先寫(xiě)個(gè)組件,供其他頁(yè)面引入調(diào)用,

CodeEditor.vue

<template>
 <div class="code-container" ref="container"></div>
</template>

<script>
 import * as monaco from "monaco-editor";
 let sqlStr =
 "ADD EXCEPT PERCENT ALL EXEC PLAN ALTER EXECUTE PRECISION AND EXISTS PRIMARY ANY EXIT PRINT AS FETCH PROC ASC FILE PROCEDURE AUTHORIZATION FILLFACTOR PUBLIC BACKUP FOR RAISERROR BEGIN FOREIGN READ BETWEEN FREETEXT READTEXT BREAK FREETEXTTABLE RECONFIGURE BROWSE FROM REFERENCES BULK FULL REPLICATION BY FUNCTION RESTORE CASCADE GOTO RESTRICT CASE GRANT RETURN CHECK GROUP REVOKE CHECKPOINT HAVING RIGHT CLOSE HOLDLOCK ROLLBACK CLUSTERED IDENTITY ROWCOUNT COALESCE IDENTITY_INSERT ROWGUIDCOL COLLATE IDENTITYCOL RULE COLUMN IF SAVE COMMIT IN SCHEMA COMPUTE INDEX SELECT CONSTRAINT INNER SESSION_USER CONTAINS INSERT SET CONTAINSTABLE INTERSECT SETUSER CONTINUE INTO SHUTDOWN CONVERT IS SOME CREATE JOIN STATISTICS CROSS KEY SYSTEM_USER CURRENT KILL TABLE CURRENT_DATE LEFT TEXTSIZE CURRENT_TIME LIKE THEN CURRENT_TIMESTAMP LINENO TO CURRENT_USER LOAD TOP CURSOR NATIONAL TRAN DATABASE NOCHECK TRANSACTION DBCC NONCLUSTERED TRIGGER DEALLOCATE NOT TRUNCATE DECLARE NULL TSEQUAL DEFAULT NULLIF UNION DELETE OF UNIQUE DENY OFF UPDATE DESC OFFSETS UPDATETEXT DISK ON USE DISTINCT OPEN USER DISTRIBUTED OPENDATASOURCE VALUES DOUBLE OPENQUERY VARYING DROP OPENROWSET VIEW DUMMY OPENXML WAITFOR DUMP OPTION WHEN ELSE OR WHERE END ORDER WHILE ERRLVL OUTER WITH ESCAPE OVER WRITETEXT";
 export default {
 name: "codeEditor",

 props: {
  options: {
  type: Object,
  default() {
   return {
   language: "java", // shell、sql、python
   readOnly: true // 不能編輯
   };
  }
  },

  value: {
  type: String,
  default: ""
  }
 },

 data() {
  return {
  monacoInstance: null,
  provider: null,
  hints: [
   "SELECT",
   "INSERT",
   "DELETE",
   "UPDATE",
   "CREATE TABLE",
   "DROP TABLE",
   "ALTER TABLE",
   "CREATE VIEW",
   "DROP VIEW",
   "CREATE INDEX",
   "DROP INDEX",
   "CREATE PROCEDURE",
   "DROP PROCEDURE",
   "CREATE TRIGGER",
   "DROP TRIGGER",
   "CREATE SCHEMA",
   "DROP SCHEMA",
   "CREATE DOMAIN",
   "ALTER DOMAIN",
   "DROP DOMAIN",
   "GRANT",
   "DENY",
   "REVOKE",
   "COMMIT",
   "ROLLBACK",
   "SET TRANSACTION",
   "DECLARE",
   "EXPLAN",
   "OPEN",
   "FETCH",
   "CLOSE",
   "PREPARE",
   "EXECUTE",
   "DESCRIBE",
   "FORM",
   "ORDER BY"
  ]
  };
 },
 created() {
  this.initHints();
 },
 mounted() {
  this.init();
 },
 beforeDestroy() {
  this.dispose();
 },

 methods: {
  dispose() {
  if (this.monacoInstance) {
   if (this.monacoInstance.getModel()) {
   this.monacoInstance.getModel().dispose();
   }
   this.monacoInstance.dispose();
   this.monacoInstance = null;
   if(this.provider){
   this.provider.dispose();
   this.provider = null
   }
  }
  },
  initHints() {
  let sqlArr = sqlStr.split(" ");
  this.hints = Array.from(new Set([...this.hints, ...sqlArr])).sort();
  },
  init() {
  let that = this;
  this.dispose();
  let createCompleters = textUntilPosition => {
   //過(guò)濾特殊字符
   let _textUntilPosition = textUntilPosition
   .replace(/[\*\[\]@\$\(\)]/g, "")
   .replace(/(\s+|\.)/g, " ");
   //切割成數(shù)組
   let arr = _textUntilPosition.split(" ");
   //取當(dāng)前輸入值
   let activeStr = arr[arr.length - 1];
   //獲得輸入值的長(zhǎng)度
   let len = activeStr.length;

   //獲得編輯區(qū)域內(nèi)已經(jīng)存在的內(nèi)容
   let rexp = new RegExp('([^\\w]|^)'+activeStr+'\\w*', "gim");
   let match = that.value.match(rexp);
   let _hints = !match ? [] : match.map(ele => {
   let rexp = new RegExp(activeStr, "gim");
   let search = ele.search(rexp);
   return ele.substr(search)
   })

   //查找匹配當(dāng)前輸入值的元素
   let hints = Array.from(new Set([...that.hints, ..._hints])).sort().filter(ele => {
   let rexp = new RegExp(ele.substr(0, len), "gim");
   return match && match.length === 1 && ele === activeStr || ele.length === 1
    ? false
    : activeStr.match(rexp);
   });
   //添加內(nèi)容提示
   let res = hints.map(ele => {
   return {
    label: ele,
    kind: that.hints.indexOf(ele) > -1 ? monaco.languages.CompletionItemKind.Keyword : monaco.languages.CompletionItemKind.Text,
    documentation: ele,
    insertText: ele
   };
   });
   return res;
  };
  this.provider = monaco.languages.registerCompletionItemProvider("sql", {
   provideCompletionItems(model, position) {
   var textUntilPosition = model.getValueInRange({
    startLineNumber: position.lineNumber,
    startColumn: 1,
    endLineNumber: position.lineNumber,
    endColumn: position.column
   });
   var suggestions = createCompleters(textUntilPosition);
   return {
    suggestions: suggestions
   };

   return createCompleters(textUntilPosition);
   }
  });

  // 初始化編輯器實(shí)例
  this.monacoInstance = monaco.editor.create(this.$refs["container"], {
   value: this.value,
   theme: "vs-dark",
   autoIndex: true,
   ...this.options
  });

  // 監(jiān)聽(tīng)編輯器content變化事件
  this.monacoInstance.onDidChangeModelContent(() => {
   this.$emit("contentChange", this.monacoInstance.getValue());
  });
  }
 }
 };
</script>

<style lang="scss" scope>
 .code-container {
 width: 100%;
 height: 100%;
 overflow: hidden;
 border: 1px solid #eaeaea;
 .monaco-editor .scroll-decoration {
  box-shadow: none;
 }
 }
</style>

引入頁(yè)面,供本頁(yè)面使用

index.vue

<template>
 <div class="container">
 <code-editor
  :options="options"
  :value="content"
  @contentChange="contentChange"
  style="height: 400px; width: 600px;"
 ></code-editor>
 </div>
</template>

<script>
 import CodeEditor from "@/components/CodeEditor";
 export default {
 name: "SQLEditor",
 components: {
  CodeEditor
 },
 data() {
  return {
  content: "",
  options: {
   language: "sql",
   theme: 'vs',
   readOnly: false
  }
  };
 },
 created() {},
 methods: {
  // 綁定編輯器value值的變化
  contentChange(val) {
  this.content = val;
  }
 }
 };
</script>


<style scoped lang="scss">
 .container {
 text-align: left;
 padding: 10px;
 }
</style>

效果如下所示

代碼自動(dòng)提示效果,如下所示

代碼高亮效果,代碼段折疊效果,右側(cè)預(yù)覽效果如下所示

以上就是vue 使用monaco實(shí)現(xiàn)代碼高亮的詳細(xì)內(nèi)容,更多關(guān)于vue 代碼高亮的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue+iview tabs context-menu 彈出框修改樣式的方法

    vue+iview tabs context-menu 彈出框修改樣式的方法

    今天遇到一個(gè)需求說(shuō)頁(yè)面頂部的菜單右鍵彈出框離得有點(diǎn)遠(yuǎn),需要我們做調(diào)整,下面小編給大家分享下vue+iview tabs context-menu 彈出框修改樣式的方法,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • vue使用pdf.js預(yù)覽pdf文件的方法

    vue使用pdf.js預(yù)覽pdf文件的方法

    在頁(yè)面進(jìn)行pdf預(yù)覽的時(shí)候,由于文件不能夠打印和下載很難滿足客戶的需求,接下來(lái)通過(guò)本文給大家介紹vue使用pdf.js來(lái)進(jìn)行pdf預(yù)覽,需要的朋友可以參考下
    2021-12-12
  • vue實(shí)現(xiàn)點(diǎn)擊按鈕下載文件功能

    vue實(shí)現(xiàn)點(diǎn)擊按鈕下載文件功能

    這篇文章主要介紹了vue中點(diǎn)擊按鈕下載文件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Vue中使用mixin擴(kuò)展組件功能的基本步驟

    Vue中使用mixin擴(kuò)展組件功能的基本步驟

    Mixin是面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中的類,提供了方法的實(shí)現(xiàn),其他類可以訪問(wèn)mixin類的方法而不必成為其子類在Vue中,可以使用mixin來(lái)擴(kuò)展組件的功能,本文給大家介紹了Vue中如何使用mixin擴(kuò)展組件功能,需要的朋友可以參考下
    2024-11-11
  • vue中v-model動(dòng)態(tài)生成的實(shí)例詳解

    vue中v-model動(dòng)態(tài)生成的實(shí)例詳解

    這篇文章主要介紹了vue中v-model動(dòng)態(tài)生成的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • v-model中如何使用過(guò)濾器

    v-model中如何使用過(guò)濾器

    這篇文章主要介紹了v-model中如何使用過(guò)濾器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vue3?Reactive響應(yīng)式原理邏輯詳解

    Vue3?Reactive響應(yīng)式原理邏輯詳解

    這篇文章主要介紹了Vue3?Reactive響應(yīng)式原理邏輯詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • vue使用webPack打包發(fā)布后頁(yè)面顯示空白的解決

    vue使用webPack打包發(fā)布后頁(yè)面顯示空白的解決

    這篇文章主要介紹了vue使用webPack打包發(fā)布后頁(yè)面顯示空白的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Vue.js進(jìn)行查詢操作的實(shí)例詳解

    Vue.js進(jìn)行查詢操作的實(shí)例詳解

    這篇文章主要介紹了Vue.js進(jìn)行查詢操作的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • Vue3異步數(shù)據(jù)加載組件suspense的使用方法

    Vue3異步數(shù)據(jù)加載組件suspense的使用方法

    前端開(kāi)發(fā)中異步請(qǐng)求是非常常見(jiàn)的事情,比如遠(yuǎn)程讀取圖片,調(diào)用后端接口等等,這篇文章主要給大家介紹了關(guān)于Vue3異步數(shù)據(jù)加載組件suspense的使用方法,suspense中文含義是懸念的意思,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

五大连池市| 绍兴县| 靖边县| 普兰县| 静乐县| 竹溪县| 天峻县| 永新县| 崇左市| 嘉黎县| 乌恰县| 司法| 大丰市| 普格县| 博野县| 东至县| 资源县| 石泉县| 思南县| 淳化县| 布尔津县| 荆门市| 登封市| 南雄市| 会泽县| 新龙县| 汉中市| 沂南县| 凤山县| 荃湾区| 治多县| 会泽县| 威海市| 疏附县| 霞浦县| 扎鲁特旗| 视频| 清镇市| 商都县| 韩城市| 浮山县|