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

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

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

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

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

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

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

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

當(dāng)然啦,npm下載很是緩慢,換個國內(nè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)

核心代碼如下所示

首先寫個組件,供其他頁面引入調(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 => {
   //過濾特殊字符
   let _textUntilPosition = textUntilPosition
   .replace(/[\*\[\]@\$\(\)]/g, "")
   .replace(/(\s+|\.)/g, " ");
   //切割成數(shù)組
   let arr = _textUntilPosition.split(" ");
   //取當(dāng)前輸入值
   let activeStr = arr[arr.length - 1];
   //獲得輸入值的長度
   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);
   }
  });

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

  // 監(jiān)聽編輯器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>

引入頁面,供本頁面使用

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>

效果如下所示

代碼自動提示效果,如下所示

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

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

相關(guān)文章

  • el-select組件綁定change事件的踩坑記錄

    el-select組件綁定change事件的踩坑記錄

    這篇文章主要介紹了el-select組件綁定change事件的踩坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Vue的click事件防抖和節(jié)流處理詳解

    Vue的click事件防抖和節(jié)流處理詳解

    今天小編就為大家分享一篇Vue的click事件防抖和節(jié)流處理詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue項目啟動后沒有局域網(wǎng)地址問題

    vue項目啟動后沒有局域網(wǎng)地址問題

    這篇文章主要介紹了vue項目啟動后沒有局域網(wǎng)地址問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Vue3環(huán)境安裝以及項目搭建全過程

    Vue3環(huán)境安裝以及項目搭建全過程

    Vue工程化項目環(huán)境配置還是比較麻煩的,下面這篇文章主要給大家介紹了關(guān)于Vue3環(huán)境安裝以及項目搭建的相關(guān)資料,文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Vue.js 使用v-cloak后仍顯示變量的解決方法

    Vue.js 使用v-cloak后仍顯示變量的解決方法

    這篇文章主要介紹了Vue.js 使用v-cloak后仍顯示變量的解決方法 ,文中給大家提到了v-cloak的用法,需要的朋友可以參考下
    2018-11-11
  • Vue.js簡易安裝和快速入門(第二課)

    Vue.js簡易安裝和快速入門(第二課)

    這篇文章主要為大家詳細(xì)介紹了Vue.js簡易安裝和快速入門的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 在Nginx上部署前端Vue項目的詳細(xì)步驟(超級簡單!)

    在Nginx上部署前端Vue項目的詳細(xì)步驟(超級簡單!)

    這篇文章主要介紹了在Nginx上部署前端Vue項目的詳細(xì)步驟,Nginx是一款高效的HTTP和反向代理Web服務(wù)器,作為開源軟件,Nginx以其高性能、可擴(kuò)展性和靈活性廣泛應(yīng)用于Web架構(gòu)中,文中將步驟介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • Vue項目打包優(yōu)化實踐指南(推薦!)

    Vue項目打包優(yōu)化實踐指南(推薦!)

    如果引入的庫眾多,那么vendor.js文件體積將會相當(dāng)?shù)拇?影響首開的體驗,這篇文章主要給大家介紹了關(guān)于Vue項目打包優(yōu)化實踐的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • vue2實現(xiàn)簡易時鐘效果

    vue2實現(xiàn)簡易時鐘效果

    這篇文章主要為大家詳細(xì)介紹了vue2實現(xiàn)簡易時鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 常見的5種Vue組件通信方式總結(jié)

    常見的5種Vue組件通信方式總結(jié)

    在?Vue.js?中,組件通信是開發(fā)過程中非常重要的一部分,它涉及到不同組件之間的數(shù)據(jù)傳遞和交互,本文將介紹如何實現(xiàn)父子組件之間的有效通信,并盤點了常見的5種Vue組件通信方式總結(jié),需要的朋友可以參考下
    2024-03-03

最新評論