Vue uses the method in the reference library with source code

Vue uses the method in the reference library with source code

The official source code of monaco-editor-vue is as follows

Index.js

import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';

function noop() { }

export { monaco };

export default {
  name: 'MonacoEditor',
  props: {
    diffEditor: { type: Boolean, default: false }, //Whether to use diff mode width: { type: [String, Number], default: '100%' },
    height: {type: [String, Number], default: '100%'},
    original: String, //Only valid in diff mode value: String,
    language: {type: String, default: 'javascript'},
    theme: {type: String, default: 'vs'},
    options: {type: Object, default() {return {};}},
    editorMounted: {type: Function, default: noop},
    editorBeforeMount: {type: Function, default: noop}
  },

  watch:
    options:
      deep: true,
      handler(options) {
        this.editor && this.editor.updateOptions(options);
      }
    },

    value() {
      this.editor && this.value !== this._getValue() && this._setValue(this.value);
    },

    language() {
      if(!this.editor) return;
      if(this.diffEditor){ //Update language in diff mode
        const { original, modified } = this.editor.getModel();
        monaco.editor.setModelLanguage(original, this.language);
        monaco.editor.setModelLanguage(modified, this.language);
      }else
        monaco.editor.setModelLanguage(this.editor.getModel(), this.language);
    },

    theme() {
      this.editor && monaco.editor.setTheme(this.theme);
    },

    style() {
      this.editor && this.$nextTick(() => {
        this.editor.layout();
      });
    }
  },

  computed: {
    style() {
      return {
        width: !/^\d+$/.test(this.width) ? this.width : `${this.width}px`,
        height: !/^\d+$/.test(this.height) ? this.height : `${this.height}px`
      }
    }
  },

  mounted () {
    this.initMonaco();
  },

  beforeDestroy() {
    this.editor && this.editor.dispose();
  },

  render (h) {
    return (
      <div class="monaco_editor_container" style={this.style}></div>
    );
  },

  methods: {
    initMonaco() {
      const { value, language, theme, options } = this;
      Object.assign(options, this._editorBeforeMount()); //Before editor initialization this.editor = monaco.editor[this.diffEditor ? 'createDiffEditor' : 'create'](this.$el, {
        value: value,
        language: language,
        theme: theme,
        ...options
      });
      this.diffEditor && this._setModel(this.value, this.original);
      this._editorMounted(this.editor); //After the editor is initialized},

    _getEditor() {
      if(!this.editor) return null;
      return this.diffEditor ? this.editor.modifiedEditor : this.editor;
    },

    _setModel(value, original) { //Set model in diff mode
      const { language } = this;
      const originalModel = monaco.editor.createModel(original, language);
      const modifiedModel = monaco.editor.createModel(value, language);
      this.editor.setModel({
        original: originalModel,
        modified: modifiedModel
      });
    },

    _setValue(value) {
      let editor = this._getEditor();
      if(editor) return editor.setValue(value);
    },

    _getValue() {
      let editor = this._getEditor();
      if(!editor) return '';
      return editor.getValue();
    },

    _editorBeforeMount() {
      const options = this.editorBeforeMount(monaco);
      return options || {};
    },

    _editorMounted(editor) {
      this.editorMounted(editor, monaco);
      if(this.diffEditor){
        editor.onDidUpdateDiff((event) => {
          const value = this._getValue();
          this._emitChange(value, event);
        });
      }else{
        editor.onDidChangeModelContent(event => {
          const value = this._getValue();
          this._emitChange(value, event);
        });
      }
    },

    _emitChange(value, event) {
      this.$emit('change', value, event);
      this.$emit('input', value);
    }
  }
}

How to use the _getValue method in the above library when using Vue?

Define ref = "", use this.$refs.exampleEditor._setValue('')

Refer to the following code

test.vue

<template>
  <div>
    <MonacoEditor ref="exampleEditor" width="100%" height="300" theme="vs-dark" language="javascript" :options="options" @change="codeInput" />
  </div>
</template>
<script>
import MonacoEditor from 'monaco-editor-vue'
export default {
  components:
    MonacoEditor
  },
  data() {
    return {
    }
  },
  beforeCreate() {
  },

  mounted() {
  },
  methods: {
    this.$refs.exampleEditor._setValue('')
  }
}

This is the end of this article about vue using the methods in the reference library with source code. For more relevant vue using the reference library content, please search for previous articles on 123WORDPRESS.COM or continue to browse the following related articles. I hope everyone will support 123WORDPRESS.COM in the future!

You may also be interested in:
  • How to change fonts in Vue, locally store fonts without referencing online font libraries
  • How to reference element-ui component library in vue2.0

<<:  Docker installation steps for Redmine

>>:  How to use DQL commands to query data in MySQL

Recommend

Introduction to Spark and comparison with Hadoop

Table of contents 1. Spark vs. Hadoop 1.1 Disadva...

JS implements Baidu search box

This article example shares the specific code of ...

Implementation of vue+drf+third-party sliding verification code access

Table of contents 1. Background 2. Verification p...

Installing the ping tool in a container built by Docker

Because the Base images pulled by Docker, such as...

The implementation process of ECharts multi-chart linkage function

When there is a lot of data to be displayed, the ...

How to fix the WeChat applet input jitter problem

Find the problem Let's look at the problem fi...

Implementing timed page refresh or redirect based on meta

Use meta to implement timed refresh or jump of th...

Vue uses mockjs to generate simulated data case details

Table of contents Install mockjs in your project ...

Summary of Mysql common benchmark commands

mysqlslap Common parameter description –auto-gene...

How to encapsulate the table component of Vue Element

When encapsulating Vue components, I will still u...

The url value of the src or css background image is the base64 encoded code

You may have noticed that the src or CSS backgroun...

Detailed explanation of the solution to image deformation under flex layout

Flex layout is a commonly used layout method nowa...

MySQL query method with multiple conditions

mysql query with multiple conditions Environment:...