Vue3 + Monaco Editor Web编辑器

yarn add monaco-editor @monaco-editor/loader

Index.vue:

javascript 复制代码
<script setup>
import { ref, onMounted } from 'vue'
import MonacoEditor from './MonacoEditor.vue'

const code = ref('// Hello World')
const language = ref('java')
const theme = ref('default-theme') // default-theme vs-dark

const logValue = () => {
  console.log(code.value)
}

onMounted(() => {
  code.value = 
`
Here is the chat histories between human and assistant, inside <histories></histories> XML tags.

\`\`\`java

示例代码
package com.cool.modules.base.entity.sys;


import com.cool.core.base.BaseEntity;
import com.tangzc.autotable.annotation.enums.IndexTypeEnum;


import com.tangzc.mybatisflex.autotable.annotation.ColumnDefine;
import com.mybatisflex.annotation.Table;
import com.tangzc.autotable.annotation.Index;
import lombok.Getter;
import lombok.Setter;


/**
 * 系统配置
 */
@Getter
@Setter
@Table(value = "base_sys_conf", comment = "系统配置表")
public class BaseSysConfEntity extends BaseEntity<BaseSysConfEntity> {
    @Index(type = IndexTypeEnum.UNIQUE)
    @ColumnDefine(comment = "配置键", notNull = true)
    private String cKey;


    @ColumnDefine(comment = "值", notNull = true, type = "text")
    private String cValue;
}


\`\`\`

<histories>
{{#histories#}}
</histories>


Human: {{#sys.query#}}

Assistant:
`
})
</script>

<template>
  <div id="editor" style="height: 400px">
    <MonacoEditor
      v-model:value="code"
      :language="language"
      :theme="theme"
    />
  </div>
  <div class="controls">
    <label for="language">Select Language: </label>
    <select id="language" v-model="language">
      <option value="java">Java</option>
      <option value="javascript">Javascript</option>
    </select>
  </div>
  <button @click="logValue">Log Value</button>
</template>

MonacoEditor.vue:

javascript 复制代码
<script setup>
import { ref, onMounted, onBeforeUnmount, watch, defineProps, defineEmits } from 'vue'
import loader from '@monaco-editor/loader'

const props = defineProps({
  value: String,
  language: {
    type: String,
    default: 'java'
  },
  theme: {
    type: String,
    default: 'vs-dark'
  }
})

const emits = defineEmits(['update:value'])

const editorContainer = ref(null)
let editorInstance = null

onMounted(() => {
  loader.init().then((monaco) => {
    editorInstance = monaco.editor.create(editorContainer.value, {
      value: props.value || '',
      language: props.language,
      theme: props.theme,
      readOnly: true,
      domReadOnly: true,
      quickSuggestions: false,
      minimap: { enabled: false },
      lineNumbersMinChars: 1,
      lineNumbers: 'off',
      wordWrap: 'on',
      unicodeHighlight: {
        ambiguousCharacters: false
      }
    })

    editorInstance.onDidChangeModelContent(() => {
      emits('update:value', editorInstance.getValue())
    })
  })
})

onBeforeUnmount(() => {
  if (editorInstance) {
    editorInstance.dispose()
  }
})

watch(
  () => props.language,
  (newLanguage) => {
    if (editorInstance) {
      loader.init().then((monaco) => {
        monaco.editor.setModelLanguage(editorInstance.getModel(), newLanguage)
      })
    }
  }
)

watch(
  () => props.value,
  (newValue) => {
    if (editorInstance && editorInstance.getValue() !== newValue) {
      editorInstance.setValue(newValue)
    }
  }
)
</script>

<template>
  <div ref="editorContainer" class="editor-container"></div>
</template>

<style>
.editor-container {
  width: 100%;
  height: 100%;
}
</style>

参考链接

https://blog.csdn.net/weixin_67711401/article/details/140729746

https://aydk.site/

https://microsoft.github.io/monaco-editor/

人工智能学习网站

https://chat.xutongbao.top

相关推荐
utf8mb4安全女神19 小时前
HTML网页【vscode】【Linux】
ide·vscode·编辑器
百度搜知知学社20 小时前
一键装裱照片,相框APP内置滤镜与贴纸编辑器
android·编辑器·滤镜·图片编辑·贴纸·相框
zyplayer-doc1 天前
继飞书之后,又一款知识库推出了开源 Agent-Native CLI 工具
人工智能·pdf·编辑器·飞书·开源软件
伶俜661 天前
鸿蒙原生应用实战(一):从零开发一个短视频编辑器 App
编辑器·音视频·harmonyos
山峰哥1 天前
从全表扫描到覆盖索引:我是怎么干掉慢查询的
数据库·sql·oracle·性能优化·编辑器·深度优先
_Athie1 天前
【开发工具】自动创建项目文件夹结构
unity·编辑器
内存不泄露1 天前
性价比极高的中转平台
编辑器
qinwsq2 天前
keil编译第一个工程
编辑器
VidDown2 天前
VidDown 工具站:视频分辨率技术
javascript·网络·编辑器·音视频·视频编解码·视频
xiaoshuaishuai82 天前
C# 定制化Markdown编辑器
开发语言·c#·编辑器