Monaco Editor安装,vue3中使用,自定义高亮,自定义提示,附完整代码

这篇具有很好参考价值的文章主要介绍了Monaco Editor安装,vue3中使用,自定义高亮,自定义提示,附完整代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、安装

	yarn add monaco-editor
	或
	npm install monaco-editor --save

二、使用

<div ref="editorContainer" style="height:100%;"></div>
import * as monaco from 'monaco-editor';
const editorContainer = ref<any>(null)
const editor = ref<any>(null)
onMounted(() => {
  editor.value = monaco.editor.create(editorContainer.value,{
    value: "test",
    language:"javascript",
    folding: true, // 是否折叠
    foldingHighlight: true, // 折叠等高线
    foldingStrategy: "indentation", // 折叠方式  auto | indentation
    showFoldingControls: "always", // 是否一直显示折叠 always | mouseover
    disableLayerHinting: true, // 等宽优化
    emptySelectionClipboard: false, // 空选择剪切板
    selectionClipboard: false, // 选择剪切板
    automaticLayout: true, // 自动布局
    codeLens: false, // 代码镜头
    scrollBeyondLastLine: false, // 滚动完最后一行后再滚动一屏幕
    colorDecorators: true, // 颜色装饰器
    accessibilitySupport: "off", // 辅助功能支持  "auto" | "off" | "on"
    lineNumbers: "on", // 行号 取值: "on" | "off" | "relative" | "interval" | function
    lineNumbersMinChars: 5, // 行号最小字符   number
    readOnly: false, //是否只读  取值 true | false
  })
})

三、自定义高亮

monaco.languages.register({ id: 'mylanguages' })
monaco.languages.setMonarchTokensProvider('mylanguages', {
  ignoreCase: true, // 忽略大小写
  tokenizer: {
    root:[
          [/curl/, {token: "string.escape"}],
          [/-X|-H|-d/, {token: "keyword"}],
          [/POST|GET|DELETE|PATCH|PUT/, {token: "comment.doc"}],
    ],
  }
})

root中为高亮规则。[/curl/, {token: “string.escape”}]:表示 ‘curl’ 的高亮颜色为粉色
高亮颜色参考:https://microsoft.github.io/monaco-editor/monarch.html
效果:
monaco editor 代码提示,javascript,开发语言,ecmascript

四、自定义提示

monaco.languages.registerHoverProvider('mylanguages', { // 光标移入提示功能
    provideHover: function (model, position, token) {
      const lineword = model.getLineContent(position.lineNumber) // 获取光标悬停所在行的所有内容
      const word = model.getWordAtPosition(position)?.word // 获取光标悬停的单词
        if (word === "name") {
          return {
            contents: [
              { value: `${word}` },
              {
                value: [
                  "这是name的一些介绍",
                  "这是name的一些介绍",
                ].join("\n\n"),
              },
            ],
          };
        } else if(undefined !== word){
          return {
            contents: [
              { value: `${word}` },
              {
                value: [
                  lineword
                ].join("\n\n"),
              },
            ],
          }
        }
    },
  });

效果:
monaco editor 代码提示,javascript,开发语言,ecmascript

monaco editor 代码提示,javascript,开发语言,ecmascript

五、完整代码

1、父组件:HomeView.vue
父组件中传给子组件所需的组件高度、初始内容、高亮类型、是否只读
子组件通过editorChange方法给父组件实时传值

<template>
  <div>
      <monaco
        ref="monacoEdit"
        :value="data"
        :readonly="false"
        type="curl"
        :height="300"
        @editorChange="editorChange"
      ></monaco>
  </div>
</template>
<script setup lang="ts">
import monaco from '../components/MonacoView.vue'
import { ref, toRefs, reactive } from "vue"
 const data = ref('test')
function editorChange(val: string) {
//val:子组件实时传过来的值
  console.log(val)
}
</script>
 
<style scoped>
  
</style>

2、子组件:MonacoView.vue

<template>
  <div class="editorapp">
    <div ref="editorContainer" :style="{height:editor_height}"></div>
  </div>
  
</template>

<script setup lang="ts">
import { onMounted, ref, toRaw, watchEffect } from "vue"
// 引入方法一
import * as monaco from 'monaco-editor';

// 引入方法二( 这种引入方法体积小但没有鼠标悬停方法registerHoverProvider)
// import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js';
// import 'monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution'

const emit = defineEmits(['contentChange'])
const props = defineProps({
  value: {
    type: String,
    default: '',
  },
  height: { // 编辑器height
    type: [String, Number],
    default: 500,
  },
  readonly: { // 是否只读
    type: Boolean,
    default: false,
  },
  type: { // 高亮类型(javascript、curl等,javascript:自带的,curl:自定义的高亮规则)
    type: String,
    default: 'javascript',
  }
})
const editorContainer = ref<any>(null)
const editor = ref<any>(null)
const data = ref(props.value)
const editor_height = ref(`${props.height}px`)
onMounted(() => {
   // 初始化编辑器,确保dom已经渲染
  if(props.type === 'curl'){ // 如果是curl 类型则重新定义高亮规则,否则使用自带的高亮语言
    monaco.languages.register({ id: props.type })
    monaco.languages.setMonarchTokensProvider(props.type, {
      ignoreCase: true,
      tokenizer: {
        root:[
              [/curl/, {token: "string.escape"}],
              [/-X|-H|-d/, {token: "keyword"}],
              [/POST|GET|DELETE|PATCH|PUT/, {token: "comment.doc"}],
        ],
      }
    })
  }
  monaco.languages.registerHoverProvider(props.type, { // 光标移入提示功能
    provideHover: function (model, position, token) {
      const lineword = model.getLineContent(position.lineNumber) // 获取光标悬停所在行的所有内容
      const word = model.getWordAtPosition(position)?.word // 获取光标悬停的单词
        if (word === "name") {
          return {
            contents: [
              { value: `${word}` },
              {
                value: [
                  "这是name的一些介绍",
                  "这是name的一些介绍",
                ].join("\n\n"),
              },
            ],
          };
        } else if(undefined !== word){
          return {
            contents: [
              { value: `${word}` },
              {
                value: [
                  lineword
                ].join("\n\n"),
              },
            ],
          }
        }
    },
  });
  editor.value = monaco.editor.create(editorContainer.value,{
    value: data.value,
    language:props.type,
    folding: true, // 是否折叠
    foldingHighlight: true, // 折叠等高线
    foldingStrategy: "indentation", // 折叠方式  auto | indentation
    showFoldingControls: "always", // 是否一直显示折叠 always | mouseover
    disableLayerHinting: true, // 等宽优化
    emptySelectionClipboard: false, // 空选择剪切板
    selectionClipboard: false, // 选择剪切板
    automaticLayout: true, // 自动布局
    codeLens: false, // 代码镜头
    scrollBeyondLastLine: false, // 滚动完最后一行后再滚动一屏幕
    colorDecorators: true, // 颜色装饰器
    accessibilitySupport: "off", // 辅助功能支持  "auto" | "off" | "on"
    lineNumbers: "on", // 行号 取值: "on" | "off" | "relative" | "interval" | function
    lineNumbersMinChars: 5, // 行号最小字符   number
    readOnly: props.readonly, //是否只读  取值 true | false

  })
  editor.value.onDidChangeModelContent((val: any) => {
    //内容改变时给父组件实时返回值
    emit('editorChange', toRaw(editor.value).getValue())
  })
})
watchEffect(()=>{ // 监听父组件值的变化,重新赋值给编辑器
  if(editor.value)
    toRaw(editor.value).setValue(props.value)
})
</script>

<style scoped>
.editorapp {
  height: 100%;
  width: 100vh;
}
</style>

效果:
monaco editor 代码提示,javascript,开发语言,ecmascript
monaco editor 代码提示,javascript,开发语言,ecmascript

六、实际问题

没有实现双向绑定。子组件给父组件传值会比较麻烦,如果是很多页面都要使用的话要重复写很多接收参数的方法,并且重复定义很多额外的参数来接收子组件的传值

父组件中定义额外的参数来接收子组件的传值的原因:
monaco editor 代码提示,javascript,开发语言,ecmascript
修改:
父组件中:改为v-model,不再需要editorChange方法了

<monaco-editor ref="monacoEdit" v-model="data" :readonly="false" main="javascript" bgcolor="vs-dark'" />

子组件中:(只显示修改的部分)文章来源地址https://www.toymoban.com/news/detail-602245.html

// 编辑器避免重复赋值
watchEffect(() => {
  if (editor.value && toRaw(editor.value).getValue() !== props.modelValue)
    toRaw(editor.value).setValue(props.modelValue)
})
const emit = defineEmits<{
  (e: 'update:modelValue', value: string): void
}>()
// 监听值的变化
  editor.value.onDidChangeModelContent((val: any) => {
    // 给父组件实时返回最新文本
    emit('update:modelValue', toRaw(editor.value).getValue())
  })

到了这里,关于Monaco Editor安装,vue3中使用,自定义高亮,自定义提示,附完整代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Monaco Editor教程(二十):在编辑器的某个特定位置插入自定义的dom内容,图片,表单,表格,视频

    哇咔咔,这是我的第20篇Monaco教程,写完这一篇会暂时休息一段时间,练练字,存存稿,读读书,顺便修修文章。 目前全网成系统的monaco中文专栏应该只有我这一个,欢迎评论区打脸。自结束了GitLab CI/CD的专栏后,我就一直在利用业余时间学习Monaco相关的知识,一是为了弥补

    2023年04月16日
    浏览(62)
  • Monaco-editor使用指南,遇到问题详解

    初始化对象 这里需要引入你需要的语言包 complete.js如下 kind为枚举类型,可根据自定义提示类型选择,可选值有 Function、Keyword、Text、Method、Event、Operator、Unit、Value、Constant、Enum、Color等 QQ录屏20230215171945 我这里是在vs-dark的基础上定义的主题配色 效果图如下 图上是json的效果

    2024年02月06日
    浏览(54)
  • 使用 monaco-editor-nls 汉化 右键菜单汉化部分失败原因

    首先使用npm或者其他包管理工具安装依赖插件: 如果右键菜单汉化一部分失败,首先去项目下看node_modules/monaco-editor-nls/locale/zh-hans中搜vs/editor/contrib/format/看一下是否有路径有brower字段,再去对应的node_modules/monaco-editor/esm/vs/editor/contrib/format/formatActions看是否有brower文件夹 如果

    2024年02月15日
    浏览(41)
  • monaco,monaco-editor,monaco-editor-webpack-plugin,

    \\\"Monaco\\\"是包含了Monaco Editor和Monaco Language Server两个项目的总称,而\\\"Monaco Editor\\\"是Monaco项目中的一个部分,它是一款基于Web技术的高性能代码编辑器。 Monaco Language Server是一个支持多种语言的语言服务器,可以提供语法分析、代码补全、错误检查、重构等功能。Monaco Editor可以与

    2024年02月14日
    浏览(42)
  • react-app框架——使用monaco editor实现online编辑html代码编辑器

    大家好,我是yma16,本文分享关于 react-app框架——使用monaco editor实现online编辑html代码编辑器。 monaco editor 编辑器 Monaco Editor是一款功能强大的Web编辑器,由微软开发并使用在多个项目中。它是基于VS Code编辑器的核心组件,具有类似的功能和用户体验。 Monaco Editor具有以下特点

    2024年01月20日
    浏览(49)
  • vue3 wangeditor/editor富文本使用和编辑

    第一步:安装 第二步:使用 最终效果图: 第四:工具栏配置 进入官方demo:https://www.wangeditor.com/demo/index.html 打开之后,按F12在控制台输入 toolbar.getConfig()  查看工具栏的默认配置。  如果有不需要的工具栏项,可以在  toolbarConfig.excludeKeys 中配置

    2024年01月21日
    浏览(50)
  • uniapp小程序,H5,Editor组件封装、使用及回显(vue3)

    官网链接:editor | uni-app官网 (dcloud.net.cn)

    2024年02月01日
    浏览(42)
  • 代码编辑器之monaco editor

    (一)简介 底层vscode开发的一款编辑器,各方面的样式功能基本与vscode一致。 (二)官方文档 Monaco Editor (microsoft.github.io) (三)安装 安装时两者版本要对应,对应表在后面 (四)属性 以下是较为常见的属性 (五) 方法 挑选出使用频次较高的 monaco.editor.setTheme(‘主题色名字

    2024年02月21日
    浏览(42)
  • Monaco Editor教程(二二):monaco编辑器完整配置翻译及重点配置解析

    本篇文章讲解一下创建Monaco编辑器时所有完整配置,算是一个比较浅显的入门文章。 但由于一个Monaco的配置项多达150个,整篇文章耗费了我5天的下班时间,请读者自行点赞收藏。这里结合实际的项目业务场景介绍一些常用的,有可能修改的默认配置参数。Monaco已经默认了很

    2023年04月25日
    浏览(50)
  • 解决Vue3 使用Element-Plus导航刷新active高亮消失

    启用路由模式会在激活导航时以 index 作为 path 进行路由跳转 使用 default-active 来设置加载时的激活项。 接下来打印一下选中项index和index路径, 刷新也是没有任何问题的,active不会消失,整体代码如下:

    2024年02月14日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包