Monaco-Editor在Vue中使用(实现代码编辑与diff代码比较)

2023-11-05

Monaco在线代码编辑器使用总结

1.什么是Monaco

Monaco编辑器是为VS代码提供支持的代码编辑器

官方API文档

2.Monaco Editor安装及使用

2.1安装
npm install monaco-editor --save-dev

npm install monaco-editor-webpack-plugin --save-dev
2.2配置vue.config.js
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin')
module.exports = {
    configureWebpack: {
        plugins: [
            new MonacoWebpackPlugin()
        ]
    }
}

2.3 开始使用
2.3.1.vue文件中导入monaco
import * as monaco from 'monaco-editor'
2.3.2.创建代码编辑区域
 <div ref="container" class="monaco-editor"></div>
2.3.3.初始化container
2.3.3.1 准备monaco基础配置
  data () {
    return {
      // 主要配置
      defaultOpts: {
       // 编辑器的值
        value: '',
         // 编辑器主题:vs, hc-black, or vs-dark,更多选择详见官网
        theme: 'vs-dark',
        // 右侧不显示编辑器预览框
        roundedSelection: true, 
        // 自动缩进
        autoIndent: true ,
        // 是否只读
        readOnly: false, 
        // 语言类型java,c,php更多选择详见官网
        language: 'javascript', 
      }
        // 编辑器对象
      monacoEditor: {}
    }
  },
2.3.3.2 初始化monaco编辑器
methods: {
    init () {
      // 初始化container的内容,销毁之前生成的编辑器
      this.$refs.container.innerHTML = ''
      // 生成编辑器配置
      let editorOptions = Object.assign(this.defaultOpts, this.opts)
      // 生成编辑器对象
      this.monacoEditor = monaco.editor.create(this.$refs.container, editorOptions)
      // 编辑器内容发生改变时触发
      this.monacoEditor.onDidChangeModelContent(() => {
        this.$emit('change', this.monacoEditor.getValue())
      })
    },
   // 手动编辑器中的内容
   getValue() {
        this.$message.info(this.$refs.monaco.getVal())
    },
}
整体源码:
  1. monacoeditor.vue
<template>
  <div
    ref="container"
    class="monaco-editor"
    :style="`height: ${height}px`"
  ></div>
</template>
<script>
import * as monaco from 'monaco-editor'
export default {
  name: 'AcMonaco',
  props: {
    opts: {
      type: Object,
      default () {
        return {}
      }
    },
    height: {
      type: Number,
      default: 300
    }
  },
  data () {
    return {
      // 主要配置
      defaultOpts: {
        value: '', // 编辑器的值
        theme: 'vs-dark', // 编辑器主题:vs, hc-black, or vs-dark,更多选择详见官网
        roundedSelection: true, // 右侧不显示编辑器预览框
        autoIndent: true // 自动缩进
      },
      // 编辑器对象
      monacoEditor: {}
    }
  },
  watch: {
    opts: {
      handler () {
        this.init()
      },
      deep: true
    }
  },
  mounted () {
    this.init()
  },
  methods: {
    init () {
      // 初始化container的内容,销毁之前生成的编辑器
      this.$refs.container.innerHTML = ''
      // 生成编辑器配置
      let editorOptions = Object.assign(this.defaultOpts, this.opts)
      // 生成编辑器对象
      this.monacoEditor = monaco.editor.create(this.$refs.container, editorOptions)
      // 编辑器内容发生改变时触发
      this.monacoEditor.onDidChangeModelContent(() => {
        this.$emit('change', this.monacoEditor.getValue())
      })
    },
    // 供父组件调用手动获取值
    getVal () {
      return this.monacoEditor.getValue()
    }
  }
}
</script>

  1. App.vue

<template>
  <div>
    <div id="app">
      <img
        alt="Vue logo"
        style="width: 200px; height: 200px"
        src="./assets/logo.png"
      />
      <h1>Easy-CodeEditor</h1>
      <div>
        语言:
        <el-select
          v-model="opts.language"
          clearable
          placeholder="请选择"
          size="mini"
          @change="changeLanguage"
        >
          <el-option
            v-for="item in sets.language"
            :key="item"
            :label="item"
            :value="item"
          >
          </el-option>
        </el-select>
        样式风格:
        <el-select
          v-model="opts.theme"
          clearable
          placeholder="请选择"
          size="mini"
          @change="changeTheme"
        >
          <el-option
            v-for="item in sets.theme"
            :key="item"
            :label="item"
            :value="item"
          >
          </el-option>
        </el-select>
        <el-button type="primary" size="mini" @click="getValue"
          >获取内容</el-button
        >
      </div>
    </div>
    <div>
      <!--调用子组件-->
      <monaco
        ref="monaco"
        :opts="opts"
        @change="changeValue"
        :height="600"
      ></monaco>
    </div>
  </div>
</template>
<script>
import monaco from './components/monacoeditor'
export default {
  components: { monaco },
  data () {
    return {
      sets: {
        language: {
          'apex': 'apex',
          'azcli': 'azcli',
          'bat': 'bat',
          'c': 'c',
          'clojure': 'clojure',
          'coffeescript': 'coffeescript',
          'cpp': 'cpp',
          'csharp': 'csharp',
          'csp': 'csp',
          'css': 'css',
          'dockerfile': 'dockerfile',
          'fsharp': 'fsharp',
          'go': 'go',
          'graphql': 'graphql',
          'handlebars': 'handlebars',
          'html': 'html',
          'ini': 'ini',
          'java': 'java',
          'javascript': 'javascript',
          'json': 'json',
          'kotlin': 'kotlin',
          'less': 'less',
          'lua': 'lua',
          'markdown': 'markdown',
          'msdax': 'msdax',
          'mysql': 'mysql',
          'objective-c': 'objective-c',
          'pascal': 'pascal',
          'perl': 'perl',
          'pgsql': 'pgsql',
          'php': 'php',
          'plaintext': 'plaintext',
          'postiats': 'postiats',
          'powerquery': 'powerquery',
          'powershell': 'powershell',
          'pug': 'pug',
          'python': 'python',
          'r': 'r',
          'razor': 'razor',
          'redis': 'redis',
          'redshift': 'redshift',
          'ruby': 'ruby',
          'rust': 'rust',
          'sb': 'sb',
          'scheme': 'scheme',
          'scss': 'scss',
          'shell': 'shell',
          'sol': 'sol',
          'sql': 'sql',
          'st': 'st',
          'swift': 'swift',
          'tcl': 'tcl',
          'typescript': 'typescript',
          'vb': 'vb',
          'xml': 'xml',
          'yaml': 'yaml'
        },
        theme: {
          'vs': 'vs',
          'vs-dark': 'vs-dark',
          'hc-black': 'hc-black'
        }
      },
      opts: {
        value: '',
        readOnly: false, // 是否可编辑
        language: 'javascript', // 语言类型
        theme: 'vs-dark' // 编辑器主题
      }
    }
  },
  methods: {
    changeLanguage (val) {
      this.opts.language = val
    },
    changeTheme (val) {
      this.opts.theme = val
    },
    // 手动获取值
    getValue () {
      this.$message.info('代码已输出至控制台');
      console.log('输出代码:' + this.$refs.monaco.getVal())
    },
    // 内容改变自动获取值
    changeValue (val) {
      console.log(val)
    }
  }
}
</script>
<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>


2.3.3.3 效果:

在这里插入图片描述

2.3.3.4 注意:

1)当我们修改了defaultOpts的配置后我们需要重新初始化monaco编辑器;即重新执行this.init();

2.4 编辑器代码diff的实现
init () {
 // 初始化container的内容,销毁之前生成的编辑器
      this.$refs.container.innerHTML = ''
      // 生成编辑器配置
      let editorOptions = Object.assign(this.defaultOpts, this.opts)
       editorOptions.readOnly = true;
       editorOptions.language = 'javascript'
      // 初始化编辑器实例
      this.monacoDiffInstance = monaco.editor.createDiffEditor(this.$refs['container'],editorOptions)
      this.monacoDiffInstance.setModel({
      // oldValue为以前的值
      original: monaco.editor.createModel(this.oldValue, editorOptions.language),
       // oldValue为新的值
      modified: monaco.editor.createModel(this.newValue, editorOptions.language)
      })
    }

效果::
在这里插入图片描述

2.4.1切换为行内比较
//直接升级配置项 renderSideBySide: false 即可
this.monacoDiffInstance.updateOptions({
       renderSideBySide: false
     });

效果:
在这里插入图片描述

本文章项目地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Monaco-Editor在Vue中使用(实现代码编辑与diff代码比较) 的相关文章

随机推荐

  • down.php无法打开,php下载文件 图片不能打开,该怎么解决

    php下载文件 图片不能打开 function fileDown file name file name iconv utf 8 gb2312 file name file path E php down file name if file
  • STC15单片机实战项目 - PCB设计

    PCB设计 一 设计文件链接 1 PADS9 5格式PCB设计文件 gt Project STC15 V1 0 pcb 2 AltiumDesigner格式PCB设计文件 gt Project STC15 V1 0 PcbDoc 二 获取开
  • 【python爬虫专项(23)】利用Selenium实现网页账号登录(以豆瓣网为例)

    案例网页 https book douban com 1 找到 登陆 注册 的标签 并click 输入对应代码如下 log in browser find element by xpath id db global nav div div
  • Mac os更新系统后安装scrapy报错error: command ‘xcrun‘ failed with exit status 1

    查看报错信息 In file included from src twisted test raiser c 4 In file included from Library Developer CommandLineTools Librar
  • 14 C语言进阶自定义类型详解

    自定义类型 结构体 枚举 联合 大纲 结构体 结构体类型的声明 结构的自引用 结构体变量的定义和初始化 结构体内存对齐 结构体传参 结构体实现位段 位段的填充 可移植性 枚举 枚举的定义 枚举的优点 枚举的使用 联合 联合类型的定义 联合的
  • 敏捷测试的“三板斧“

    什么是三板斧 可灰度 任何变更 都必须是可以灰度的 即控制变更的生效范围 先做小范围变更 验证通过之后才扩大范围 可监控 在灰度的过程中 必须能做到可监控 能了解到变更之后对系统的应用 可回滚 当通过监控发现变更后会引发问题时 还需要有方法
  • 八进制数的表达方法!八进制数在转义符中的使用!

    C C 语言中 如何表达一个八进制数呢 如果这个数是 876 我们可以断定它不是八进制数 因为八进制数中不可能出7以上的阿拉伯数字 但如果这个数是123 是567 或12345670 那么它是八进制数还是10进制数 都有可能 所以 C C
  • Spring学习笔记 搭建环境

    现在开始我们就要开始学习Spring框架了 首先要做的事情就是搭建Spring环境 为了让我们关注于Spring的功能 我在这里使用Spring Initializer 它会自动为我们创建一个包含了Spring依赖的项目 让我们能直接快速开
  • 试题 算法训练 二进制数数

    问题描述 给定L R 统计 L R 区间内的所有数在二进制下包含的 1 的个数之和 如5的二进制为101 包含2个 1 输入格式 第一行包含2个数L R 输出格式 一个数S 表示 L R 区间内的所有数在二进制下包含的 1 的个数之和 样例
  • linux 防火墙打开5432 端口,在ubuntu上打开端口5432

    我试图使用ufw使用sudo ufw allow 5432 tcp在ubuntu上打开端口5432 然后我使用nmap来查看端口5432是否已打开 我得到了这个 root domain sudo nmap sS O 127 0 0 1 St
  • Linux部署kettle并设置定时任务

    一 安装Kettle linux中使用kettle时首先需要jdk环境 这里就不概述linux中jdk的安装与配置了 1 首先将kettle压缩包放入linux并解压 unzip data integration zip kettle安装路
  • C++:理解this指针

    详情见 gt https blog csdn net keneyr article details 111758870
  • STM32 DAC 学习笔记

    本文基于SYM32F4 部分参数说明参考标准库 DAC简介 作用就是把输入的数字编码 转换成对应的模拟电压输出 DAC 可以按 8 位或 12 位模式进行配置 并且可与 DMA 控制器配合使用 在 12 位模式下 数据可以采用左对齐或右对齐
  • ASP.NET MVC Note1

    学习ASP NET MVC第一件事应该就是Route 下面的图摘自的Dino的书 由此粗略的学习可以归结于理解Routing Http Module和Http Handler Route Handler是Route Module的一部分 p
  • GAMES101回顾 -- Shading

    Shading 定义 将材质作用于对象的流程 Z Buffer 帧缓存 Frame Buffer Frame Buffer是一个用于存储图像像素数据的内存区域 它通常由一个二维数组表示 每个元素对应屏幕上的一个像素 Frame Buffer
  • c语言任意两个整数相减_c语言 大整数相减

    include include include include cin输入cout输出usingnamespacestd intmain void inta b c d e o f 210 0 h 210 0 g 210 0 include
  • Unity3D 中旋转和变换

    Transform 变换 是场景中最常打交道的类 用于控制物体的位移 旋转 缩放等功能 Transform Class inherits from Component IEnumerable Position rotation and sc
  • 小程序 bindtouchmove 使用拖动按钮 页面跟着滑动并拖动卡顿感 问题

    修改 bindtouchmove buttonMove 为 catchtouchmove buttonMove 使用touchmove监听滑动要更新视图层 导致动画卡顿 阻止冒泡可以解决
  • centos7下javac:未找到命令

    如果你配置了jdk的环境变量之后 如果输入javac 报下面错误 则你可以在终端使用命令 yum install java devel 完美解决
  • Monaco-Editor在Vue中使用(实现代码编辑与diff代码比较)

    Monaco在线代码编辑器使用总结 1 什么是Monaco Monaco编辑器是为VS代码提供支持的代码编辑器 官方API文档 2 Monaco Editor安装及使用 2 1安装 npm install monaco editor sav