详解Monaco-Editor插件在Vue2.X中使用


前言

提示:以下是本篇文章正文内容,下面案例可供参考

一、Monaco-Editor是什么?

Monaco-Editor 通俗讲就是在线的vscode。方便远程工作人员在线开发。

二、使用步骤

1.下载包

npm install monaco-editor@^0.23.0 --save-dev

npm install monaco-editor-webpack-plugin@^3.0.1 --save-dev

2.新建monacoeditor.vue文件


<template>
  <div
    ref="container"
    class="monaco-editor"
    style="height:500px;margin-top:70px"
  ></div>
</template>

<script>
import * as monaco from 'monaco-editor'


export default {
  name: 'AcMonaco',
  inject: ['reload'],
  props: {
    opts: {
      type: Object,
      default () {
        return {}
      }
    },
    height: {
      type: Number,
      default: 300
    },
    isDiff: {
      type: Boolean,
      default: false
    }
  },
  data () {
    return {
      // 主要配置
      defaultOpts: {
        value: '', // 编辑器的值
        theme: 'vs-dark', // 编辑器主题:vs, hc-black, or vs-dark,更多选择详见官网
        roundedSelection: true, // 右侧不显示编辑器预览框
        autoIndent: true // 自动缩进
      },
      // 编辑器对象
      monacoEditor: {},
      oldValue: '',
      newValue: ''
    }
  },
  watch: {
    opts: {
      handler () {
        this.reload()
      },
      deep: true
    }
  },
  mounted () {
    this.init()
    this.shuru()
  },
  methods: {
    init () {
      // 初始化container的内容,销毁之前生成的编辑器
      this.$refs.container.innerHTML = ''
      // 生成编辑器配置
      let editorOptions = Object.assign(this.defaultOpts, this.opts)
      if (!this.isDiff) {
        // 初始化编辑器实例
        this.monacoEditor = monaco.editor.create(this.$refs.container, editorOptions)
        // 编辑器内容发生改变时触发
        this.monacoEditor.onDidChangeModelContent(() => {
          this.$emit('change', this.monacoEditor.getValue())
        })
      } else {
        this.oldValue = this.readLocalFile('./testCode1.js');
        this.newValue = this.readLocalFile('./testCode2.js');
        editorOptions.readOnly = true;
        editorOptions.language = 'javascript'
        // editorOptions.inlineHints = true;
        // 初始化编辑器实例
        this.monacoDiffInstance = monaco.editor.createDiffEditor(this.$refs['container'], editorOptions)
        this.monacoDiffInstance.setModel({
          original: monaco.editor.createModel(this.oldValue, editorOptions.language),
          modified: monaco.editor.createModel(this.newValue, editorOptions.language)
        })

      }
    },
    upDateDiff (val) {
      this.monacoDiffInstance.updateOptions({
        renderSideBySide: !val
      });
    },
    // 供父组件调用手动获取值
    getVal () {
      return this.monacoEditor.getValue()
    },
    // 读取本地文件函数
    readLocalFile (fileUrl) {
      let xhr = null
      if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest()
      } else {
        // eslint-disable-next-line
        xhr = new ActiveXObject('Microsoft.XMLHTTP')
      }
      const okStatus = document.location.protocol === 'file' ? 0 : 200
      xhr.open('GET', fileUrl, false)
      xhr.overrideMimeType('text/html;charset=utf-8')
      xhr.send(null)
      return (xhr.status === okStatus ? xhr.responseText : null)
    },
    shuru(){
        this.monacoEditor.setValue('hy')
    }
  }
}
</script>


配置plugins

const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin') // 引入
 plugins: [
      new webpack.NormalModuleReplacementPlugin(/msun-lib-ui[/\\]lib[/\\]styles[/\\](.*)\.css/),
      new MonacoWebpackPlugin()
    ]

All

const webpack = require('webpack');

const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin') // 引入


module.exports = {
    plugins: [
      new webpack.NormalModuleReplacementPlugin(/msun-lib-ui[/\\]lib[/\\]styles[/\\](.*)\.css/),
      new MonacoWebpackPlugin()
    ]
  }

新建 index.vue


引入monacoeditor.vue,所以文件名字不要起错

<template>
  <div>
    <div id="app">
      <img
        alt="Vue logo"
        style="width: 200px; height: 200px"
        src="./assets/logo.png"
      />
      <h1>Easy-CodeEditor</h1>
      <div style="position: relative; height: 40px; line-height: 40px">
        <div style="position: absolute; left: 0; top: 0">
          样式风格:
          <el-select
            v-model="opts.theme"
            placeholder="请选择"
            size="mini"
            @change="changeTheme"
          >
            <el-option
              v-for="item in sets.theme"
              :key="item"
              :label="item"
              :value="item"
            >
            </el-option>
          </el-select>
          <el-switch
            style="margin: 10px"
            v-model="isDiff"
            active-text="开启代码比较"
            inactive-text="关闭代码比较"
            @change="reload"
          >
          </el-switch>
        </div>
        <el-checkbox
          v-model="inlineDiff"
          @change="inlineDiffChange"
          v-if="isDiff"
          >行内比较</el-checkbox
        >
        <div v-if="!isDiff">
          语言:
          <el-select
            v-model="opts.language"
            placeholder="请选择"
            size="mini"
            @change="changeLanguage"
          >
            <el-option
              v-for="item in sets.language"
              :key="item"
              :label="item"
              :value="item"
            >
            </el-option>
          </el-select>
          <el-button
            style="margin: 0 10px"
            type="primary"
            size="mini"
            @click="getValue"
            >获取内容</el-button
          >
        </div>
      </div>
    </div>
    <div>
      <!--调用子组件-->
      <monaco
        ref="monaco"
        v-if="containerReload"
        :opts="opts"
        @change="changeValue"
        :isDiff="isDiff"
        :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' // 编辑器主题
      },
      isDiff: true,
      inlineDiff: false,
      containerReload: true
    }
  },
  provide () {
    return {
      reload: this.reload
    }
  },
  // 
  mounted () {
    // 创建一个新的xhr对象
  },
  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)
    },
    async reload () {
      this.containerReload = false
      await this.$nextTick()
      this.containerReload = true
    },
    inlineDiffChange (val) {
      this.$refs.monaco.upDateDiff(val)
    }
  }
}
</script>

<style>
</style>


样图如下
在这里插入图片描述

总结

提示此文章转载并总结于节省钱作者。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值