Vite管理的Vue3项目中monaco editer的使用以及组件封装

打印 上一主题 下一主题

主题 979|帖子 979|积分 2937

配景

做oj体系的时候,必要使用代码编辑器,决定使用Monaco Editor,但是由于自身本领问题,读不懂官网文档,最终联合ai和网友的帖子成功引入,并封装了组件,支持v-model吸收文档内容。盼望可以资助到别人。
环境说明



  • vite
  • vue3
  • pnpm
安装流程以及组件封装

引入依靠

  1. pnpm install monaco-editor
复制代码
封装组件

  1. <script setup lang="ts">
  2. import * as monaco from 'monaco-editor'
  3. import { onMounted, ref } from 'vue'
  4. // 容器对象
  5. const editorContainer = ref()
  6. // 编辑器对象
  7. let codeEditor: monaco.editor.IStandaloneCodeEditor | null = null
  8. // 声明一个input事件
  9. const emit = defineEmits(['update:modelValue'])
  10. // 从父组件中接收
  11. const props = defineProps({
  12.   language: {
  13.     type: String,
  14.     default: 'javascript'
  15.   },
  16.   modelValue: {
  17.     type: String,
  18.     default: '',
  19.     required: true
  20.   }
  21. })
  22. onMounted(() => {
  23.   codeEditor = monaco.editor.create(editorContainer.value, {
  24.     value: props.modelValue,
  25.     language: props.language,
  26.     lineNumbers: "on",
  27.     roundedSelection: false,
  28.     scrollBeyondLastLine: false,
  29.     readOnly: false,
  30.     theme: "vs",
  31.     fontSize: 24
  32.   })
  33.   // 设置监听事件
  34.   codeEditor.onDidChangeModelContent(() => {
  35.     emit('update:modelValue', codeEditor?.getValue())
  36.   })
  37. })
  38. </script>
  39. <template>
  40.   <div ref="editorContainer" style="height: 100%; width: 100%"/>
  41. </template>
  42. <style scoped>
  43. </style>
复制代码
外部使用

  1. <script setup lang="ts">
  2. import CodeEditor from '@/components/editor/CodeEditor/CodeEditor.vue'
  3. import { ref } from 'vue'
  4. // 编程语言
  5. const codeLanguage = ref('java')
  6. // 代码编辑器值
  7. const text = ref('')
  8. </script>
  9. <template>
  10.   <a-row>
  11.     <a-col :span="22" :offset="1">
  12.       <md-edit style="border: 1px black solid" @getMdEditText="getMdEditText" />
  13.       <div style="height: 500px; width: 100%; border: 1px black solid">
  14.         <code-editor :language="codeLanguage" v-model="text"/>
  15.         获取到的值:
  16.         {{ text }}
  17.       </div>
  18.     </a-col>
  19.   </a-row>
  20. </template>
复制代码
实现效果


v-model实现原理

v-model本身是vue提供的一个语法糖。v-model = @update:modelValue + :modelValue。
即当父组件中的modelValue值发生改变时,通过:modelValue传入子组件,子组件对完成页面渲染。当子组件中的钩子函数被触发时(即编辑器中的值被改变时),通过emit触发update:modelValue事件,向父组件中传值,父组件中修改modelValue的值。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表