首頁 > 軟體

vue2.x中monaco-editor的使用說明

2022-08-04 14:01:34

vue2中使用monaco-editor

安裝

注意兩個庫的版本指定

npm install monaco-editor@0.30.1 --save-dev
npm install monaco-editor-webpack-plugin@6.0.0 --save-dev

設定

vue.config.js中設定

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

建立MonacoEditor公共元件

<template>
  <div ref="editorContainer" class="editor"></div>
</template>
<script>
import * as monaco from 'monaco-editor';
export default {
  name: 'MonacoEditor',
  data() {
    return {
      code: '',
      editor: null
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      // 初始化編輯器
      this.editor = monaco.editor.create(this.$refs.editorContainer, {
        value: this.code,
        language: 'javascript',
        tabSize: 2,
        scrollBeyondLastLine: false,
        automaticLayout: true, // 自動佈局
        readOnly: false
      })
      console.log(this.editor)
      // 監聽內容變化
      this.editor.onDidChangeModelContent(() => {
      })
      // 監聽失去焦點事件
      this.editor.onDidBlurEditorText((e) => {
        console.log(e)
      });
    },
    // 獲取編輯框內容
    getCodeContext() {
      return this.editor.getValue()
    },
    // 自動格式化程式碼
    format() {
      this.editor.trigger('anything', 'editor.action.formatDocument')
      // 或者
      // this.editor.getAction(['editor.action.formatDocument']).run()
    },
    changeEditor() {
      if (this.editor === null) {
        this.init()
      }
      const oldModel = this.editor.getModel()
      const newModel = monaco.editor.createModel(
        this.code,
        'javascript'
      )
      if (oldModel) {
        oldModel.dispose()
      }
      this.editor.setModel(newModel)
    }
  }
}
</script>
<style scoped>
.editor {
  width: 100%;
  min-height: 400px;
}
</style>

父元件中使用

<template>
  <div>
    <monaco-editor></monaco-editor>
  </div>
</template>
<script>
import MonacoEditor from '@/components/MonacoEditor'
export default {
  name: 'Test6',
  components: {
    MonacoEditor
  }
}
</script>

使用vue-monaco-editor遇到的坑

編輯器重複載入上次編輯器中的內容,不會被新的內容替代

直接上程式碼

給MonacoEditor加上屬性key

      <MonacoEditor
        width="100%"
        height="537"
        :key="randomkey"
        language="html"
        theme="vs-dark"
        :code="code"
      >
      </MonacoEditor>

每次重新給code賦值時,就重新獲取一次亂數賦值給key

data() {
    return {
      randomkey: 123,
    }
  }
methods: {
    // 每次重新給code賦值時,就重新呼叫一下下面這個方法
    createRandomkey(){
      this.randomkey = Math.floor(Math.random()*(10,1000000012313))
    },
}

編輯器editorOptions上的設定無法生效

<MonacoEditor
        width="100%"
        height="537"
        :key="randomkey"
        language="html"
        theme="vs-dark"
        :code="code"
        :editorOptions="options"
        @mounted="seeOnMounted"
>
// 在data中設定無法生效
options: {
     readOnly: true
},

可以在@mounted方法中根據editor進行設定

seeOnMounted(editor) {
      this.seeEditor = editor
      this.seeEditor.updateOptions({
        readOnly: true, //是否唯讀
      })
    },

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。 


IT145.com E-mail:sddin#qq.com