亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

vue 使用monaco實現代碼高亮

瀏覽:4日期:2022-10-03 15:05:09

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

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

好了,現在正式開工吧!

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

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

當然啦,npm下載很是緩慢,換個國內鏡像,淘寶的吧。果然,速度就嗖嗖的起來。

npm install -g cnpm --registry=https://registry.npm.taobao.orgcnpm installcnpm install monaco-editorcnpm install monaco-editor-webpack-plugin

可在node_modules下看到其目錄結構

vue 使用monaco實現代碼高亮

核心代碼如下所示

首先寫個組件,供其他頁面引入調用,

CodeEditor.vue

<template> <div 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, ' '); //切割成數組 let arr = _textUntilPosition.split(' '); //取當前輸入值 let activeStr = arr[arr.length - 1]; //獲得輸入值的長度 let len = activeStr.length; //獲得編輯區域內已經存在的內容 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) }) //查找匹配當前輸入值的元素 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); }); //添加內容提示 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 }); // 監聽編輯器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' ></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>

效果如下所示

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

vue 使用monaco實現代碼高亮

代碼高亮效果,代碼段折疊效果,右側預覽效果如下所示

vue 使用monaco實現代碼高亮

以上就是vue 使用monaco實現代碼高亮的詳細內容,更多關于vue 代碼高亮的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
主站蜘蛛池模板: 日韩一级片免费看 | 欧美3p在线观看一区二区三区 | 欧美aaaaaaaaaa | 成人精品一区二区不卡视频 | 激情亚洲婷婷 | 澳门一级特黄真人毛片 | 国产成人精品福利网站人 | 免费视频日韩 | 国产精品99久久免费观看 | 国产高清在线a视频大全 | 四色婷婷婷婷色婷婷开心网 | 伊人久久久久久久久香港 | 成人亚洲视频 | 一级毛片一级毛片一级毛片 | 日韩 欧美 亚洲 中文字幕 | 免费人成网站线观看合集 | 91小视频在线观看免费版高清 | 亚洲欧美一区二区三区麻豆 | 亚洲成人在线视频播放 | 国产在线视频欧美亚综合 | 99久久999久久久综合精品涩 | 久久久免费 | 午夜日韩在线 | 中文字幕一区精品 | xxxxbbbb性猛hd高清 | 男女晚上日日麻批视频不挡 | 中文字幕日韩视频 | 日韩精品久久久久影院 | 成人三级精品视频在线观看 | 九九99香蕉在线视频网站 | 18成人免费观看网站入口 | 久久亚洲精品无码观看不卡 | 久久久青草青青亚洲国产免观 | 鲁大师7视频在线观看 | 午夜国产在线观看 | 国产成人综合视频 | 看一级黄色 | 日本免费大片免费视频 | 国产免费福利视频一区二区 | 免费看一级性生活片 | 97久久天天综合色天天综合色hd |