我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue2安装使用MonacoEditor方式(自定义语法,自定义高亮,自定义提示)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue2安装使用MonacoEditor方式(自定义语法,自定义高亮,自定义提示)

1.安装MonacoEditor

cnpm install -S editor@1.0.0
cnpm install -S monaco-editor@0.19.3
cnpm install -S monaco-editor-webpack-plugin@1.9.1

2.配置vue.config.js文件

const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
module.exports = {
  configureWebpack: {
    plugins: [
        new MonacoWebpackPlugin()
    ]
}

3.建立组件monaco.vue

<template>
  <div>
    <div class="code-container" ref="container"></div>
  </div>
</template>
 
<script>
import './icon/iconfont.css'
import * as monaco from 'monaco-editor'
import vCompletion from '@/utils/sql.js'//语法提示文件
export default {
  name: 'codeEditor',
  props: {
    opts: {
      type: Object,
      default() {
        return {
          language: 'java', // shell、sql、python
          readOnly: false, // 不能编辑
        }
      },
    },
    value:{
      type:String,
      default:''
    }
  },
  watch: {
    value: {
      handler(n) {
        if(this.showInit){//初次传值初始化一次
          this.init()
          this.showInit = false
        }
        this.monacoInstance.setValue(n)//剩余全部更新内容
      },
      deep: true,
    },
  },
  data() {
    return {
      monacoInstance: null,
      provider: null,
      hints: [],
      color: null,
      showInit:true
    }
  },
  created() {
    this.init()
  },
  mounted() {
    this.init()
  },
  beforeDestroy() {
    this.dispose()
  },
 
  methods: {
    cloneDeep(suggestions) {
      return JSON.parse(JSON.stringify(suggestions))
    },
    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.color.dispose()
          this.provider = null
        }
      }
    },
    init() {
      let that = this
      this.dispose()
      this.provider = monaco.languages.registerCompletionItemProvider('sql', {
        provideCompletionItems(model, position) {
          return {
            suggestions: that.cloneDeep(vCompletion),//自定义语法提示,代码补全
          }
        },
        triggerCharacters: ['.'],//输入点可触发代码提示
      })
        //自定义语法高亮
      this.color = monaco.languages.setMonarchTokensProvider('sql', {
        ignoreCase: true,
        tokenizer: {//需要什么颜色,就在里面用正则匹配
          root: [
            [
              /currentUser|#@|RsOk|#string|#switch|#case|selectSql|uuid|addOrderBy|addConditionRequired|countSql|addGroupBy|currentDateTime|addFieldExist|formData|simplePage|RsJson|[@]|RsJsonData|Local|select|#set|#include|#render|#end|#for|#if|#else|#elseif|from|where|addField|addConditionExist|table|SqlUtil|GROUP_CONCAT|BY|AND|ADD|Data|page|IF|as|SUM|MAX|min|AVG|COUNT|ROUND|LEFT|JOIN/,
              { token: 'keyword' },
            ], //蓝色
            [
              /[+]|[-]|[*]|[/]|[%]|[>]|[<]|[=]|[!]|[:]|[&&]|[||]/,
              { token: 'string' },
            ], //红色
            [/'.*?'|".*?"/, { token: 'string.escape' }], //橙色
            [/#--.*?\--#/, { token: 'comment' }], //绿色
            [/null/, { token: 'regexp' }], //粉色
            [/[{]|[}]/, { token: 'type' }], //青色
            // [/[\u4e00-\u9fa5]/, { token: 'predefined' }],//亮粉色
            // [/''/, { token: 'invalid' }],//红色
            // [/[\u4e00-\u9fa5]/, { token: 'number.binary' }],//浅绿
            [/(?!.*[a-zA-Z])[0-9]/, { token: 'number.hex' }], //浅绿
            [/[(]|[)]/, { token: 'number.octal' }], //浅绿
            // [/[\u4e00-\u9fa5]/, { token: 'number.float' }],//浅绿
          ],
        },
      })
      // 初始化编辑器实例
      this.monacoInstance = monaco.editor.create(this.$refs['container'], {
        value: this.value,
        theme: 'vs-dark',
        autoIndex: true,
        ...this.opts,
      })
      // 监听编辑器content变化事件
      this.monacoInstance.onDidChangeModelContent(() => {
        this.$emit('contentChange', this.monacoInstance.getValue())
      })
    },
  },
}
</script>
<style lang="scss" scope>
.code-container {
  width: 100%;
  height: 500px;
  overflow: hidden;
  border: 1px solid #eaeaea;
  .monaco-editor .scroll-decoration {
    box-shadow: none;
  }
}
</style>

4.建立语法提示文件sql.js

export default [
  
  {
     label: 'if',//触发提示的文本
     kind: monaco.languages.CompletionItemKind.Function,
     insertText: `\n#if()\n\t\n #end`,//补全的文本
     insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
     detail: '流程控制'
   },  {
     label: 'if/else',
     kind: monaco.languages.CompletionItemKind.Function,
     insertText: '\n#if()\n\n #else\n\n #end',
     insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
     detail: '流程控制'
   }
 ]

5.父组件引入monaco.vue

<template>
  <div>
    <moaco v-model="value" :opts="opts" @contentChange="contentChange"></moaco>
  </div>
</template>
 
<script>
import monaco from '@/monaco.vue'
export default {
  components: {
    monaco,
  },
  data() {
    return {
      value: '',
      countent: '',
      opts: {
        value: '',
        readOnly: false, // 是否可编辑
        language: 'sql', // 语言类型
        theme: 'vs-dark', // 编辑器主题
      },
    }
  },
  methods: {
    contentChange(val) {
      //每次改变编辑器内容触发事件,先用一个值存放数据
      this.countent = val
    },
    submit() {
      //在你提交给后台时将this.countent赋值给value
      this.countent = this.value
    },
  },
}
</script>
 
<style>
</style>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue2安装使用MonacoEditor方式(自定义语法,自定义高亮,自定义提示)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue2安装使用MonacoEditor方式(自定义语法,自定义高亮,自定义提示)

这篇文章主要介绍了Vue2安装使用MonacoEditor方式(自定义语法,自定义高亮,自定义提示),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-16

android之自定义Toast使用方法

Android系统默认的Toast十分简洁,使用也非常的简单。但是有时我们的程序使用默认的Toast时会和程序的整体风格不搭配,这个时候我们就需要自定义Toast,使其与我们的程序更加融合。使用自定义Toast,首先我们需要添加一个布局文件
2022-06-06

Android提高之自定义Menu(TabMenu)实现方法

一般使用过UCWEB-Android版的人都应该对其特殊的menu有一定的印象,把menu做成Tab-Menu(支持分页的Menu),可以容纳比Android传统的menu更丰富的内容(Android的menu超过6项则缩略在[更多]里),
2022-06-06

Android布局之LinearLayout自定义高亮背景的方法

本文实例讲述了Android布局之LinearLayout自定义高亮背景的方法。分享给大家供大家参考,具体如下: 首先创建linearlayout_background.xml文件 res/drawable/linearlayout_bac
2022-06-06

Android使用自定义字体的方法

本文实例讲述了Android使用自定义字体的方法。分享给大家供大家参考,具体如下: 一、问题: 作为android初学者,在做一个游戏,游戏的标题我用的是TextView,android只提供斜体粗体,但把字体设置成楷体游戏的界面会更好,怎
2022-06-06

Android自定义Toolbar使用方法详解

本篇文章介绍: 如何使用Toolbar; 自定义Toolbar; 先来看一看效果,了解一下toolbar;布局文件:
2022-06-06

Android不使用自定义布局情况下实现自定义通知栏图标的方法

本文实例讲述了Android不使用自定义布局情况下实现自定义通知栏图标的方法。分享给大家供大家参考,具体如下: 自定义通知栏图标?不是很简单么。自定义布局都不在话下! 是的,有xml布局文件当然一切都很简单,如果不给你布局文件用呢 听我慢慢
2022-06-06

Android中用Builder模式自定义Dialog的方法

前言 我们开发人员在实际项目过程中遇到的需求是多种多样的,有时我们要匹配APP自己的设计风格,有时我们会觉得系统的对话框使用起来不够自由,因此自己定义一个适合自己的Dialog是很有必要的。 为什么要用Builder模式 Builder设计
2022-06-06

怎么使用spring data jpa自定义sql方式

本篇内容介绍了“怎么使用spring data jpa自定义sql方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!spring data
2023-06-22

Android APP使用自定义字体实现方法

android系统内置字体 android 系统本身内置了一些字体,可以在程序中使用,并且支持在xml配置textView的时候进行修改字体的样式。支持字段为android:textStyle ,android:typeface, andr
2022-06-06

JPA怎么使用findBy方法自定义查询

这篇文章给大家分享的是有关JPA怎么使用findBy方法自定义查询的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JPA使用findBy方法自定义查询最近在项目中使用spring boot+jpa的方式来访问数据库
2023-06-21

Android自定义PhotoView使用的方法是什么

这篇“Android自定义PhotoView使用的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android自定
2023-07-05

SpringSecurity自定义Form表单使用方法讲解

这篇文章主要介绍了SpringSecurity自定义Form表单使用方法,虽然SpringSecurity提供了默认的登录表单,实际项目里肯定是不可以直接使用的,当然SpringSecurity也提供了自定义登录表单的功能
2023-01-17

如何给MySQL添加自定义语法的方法示例

目录1 背景2 新增关键词(token)3 新增语法4 类似于PT_partition添加对应的数据结构global_partition_clause1 背景mysql语法解析器用的bison(即yacc)来实现的,而词法解析是自己来实现
2022-08-08

Vue自定义组件中v-model的使用方法示例

日常开发中除了直接在input标签上使用v-model指令外,封装的组件也需要v-model,下面这篇文章主要给大家介绍了关于Vue自定义组件中v-model使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-05-19

编程热搜

目录