电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

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

使用的是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-editornpm install monaco-editor-webpack-plugin

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

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

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

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

核心代碼如下所示

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

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 => { //過(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' ></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)提示效果,如下所示

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

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

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

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

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 土壤肥料养分速测仪_测土配方施肥仪_土壤养分检测仪-杭州鸣辉科技有限公司 | 耳模扫描仪-定制耳机设计软件-DLP打印机-asiga打印机-fitshape「飞特西普」 | PSI渗透压仪,TPS酸度计,美国CHAI PCR仪,渗透压仪厂家_价格,微生物快速检测仪-华泰和合(北京)商贸有限公司 | 吉林污水处理公司,长春工业污水处理设备,净水设备-长春易洁环保科技有限公司 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 铁盒_铁罐_马口铁盒_马口铁罐_铁盒生产厂家-广州博新制罐 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | WTB5光栅尺-JIE WILL磁栅尺-B60数显表-常州中崴机电科技有限公司 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 比亚迪叉车-比亚迪电动叉车堆垛车托盘车仓储叉车价格多少钱报价 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 讲师宝经纪-专业培训机构师资供应商_培训机构找讲师、培训师、讲师经纪就上讲师宝经纪 | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 懂研帝_专业SCI论文润色机构_SCI投稿发表服务公司 | 偏心半球阀-电动偏心半球阀-调流调压阀-旋球阀-上欧阀门有限公司 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 诺冠气动元件,诺冠电磁阀,海隆防爆阀,norgren气缸-山东锦隆自动化科技有限公司 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | elisa试剂盒-PCR试剂盒「上海谷研实业有限公司」 | 粘度计,数显粘度计,指针旋转粘度计 | 低粘度纤维素|混凝土灌浆料|有机硅憎水粉|聚羧酸减水剂-南京斯泰宝 | 山东信蓝建设有限公司官网 | 酶联免疫分析仪-多管旋涡混合仪|混合器-莱普特科学仪器(北京)有限公司 | 湖南印刷厂|长沙印刷公司|画册印刷|挂历印刷|台历印刷|杂志印刷-乐成印刷 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 大型冰雕-景区冰雕展制作公司,3D创意设计源头厂家-[赛北冰雕] | 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | 辽宁资质代办_辽宁建筑资质办理_辽宁建筑资质延期升级_辽宁中杭资质代办 | 南京兰江泵业有限公司-水解酸化池潜水搅拌机-絮凝反应池搅拌机-好氧区潜水推进器 | 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | 传动滚筒,改向滚筒-淄博建凯机械科技有限公司 | 学考网学历中心| 国产离子色谱仪,红外分光测油仪,自动烟尘烟气测试仪-青岛埃仑通用科技有限公司 | 步进驱动器「一体化」步进电机品牌厂家-一体式步进驱动 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 无尘烘箱_洁净烤箱_真空无氧烤箱_半导体烤箱_电子防潮柜-深圳市怡和兴机电 | 退火炉,燃气退火炉,燃气热处理炉生产厂家-丹阳市丰泰工业炉有限公司 | 警方提醒:赣州约炮论坛真的安全吗?2025年新手必看的网络交友防坑指南 | 微型实验室真空泵-无油干式真空泵-微型涡旋耐腐蚀压缩机-思科涡旋科技(杭州)有限公司 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 |