Vue3中使用Monaco-editor的教程詳解
Monaco-editor,一個(gè)vs code 編輯器,需要將其繼承到項(xiàng)目。不說(shuō)閑話了,直接上代碼。
npm地址:https://www.npmjs.com/package/monaco-editor
中文文檔:https://aydk.site/editor/
安裝
pnpm add monaco-editor -S
pnpm add vite-plugin-monaco-editor -D
配置
vite.config.ts
import { defineConfig} from 'vite' // vs code 編輯器配置 import monacoEditorPlugin from 'vite-plugin-monaco-editor' // https://vitejs.dev/config/ export default ({ mode }) => { return defineConfig({ plugins: [ monacoEditorPlugin({ languageWorkers: ['editorWorkerService', 'typescript', 'json', 'html'] }) ] }) }
封裝
首先先封裝個(gè)hook如下:
@/hooks/useMonacoEditor.hook.ts
import * as monaco from 'monaco-editor' import useCommonStore from '@/store/common' import { ref, nextTick, onBeforeUnmount } from 'vue' export function useMonacoEditor(language: string = 'javascript') { // 編輯器示例 let monacoEditor: monaco.editor.IStandaloneCodeEditor | null = null // 目標(biāo)元素 const monacoEditorRef = ref<HTMLElement | null>(null) // 創(chuàng)建實(shí)例 function createEditor(editorOption: monaco.editor.IStandaloneEditorConstructionOptions = {}) { if(!monacoEditorRef.value) return monacoEditor = monaco.editor.create(monacoEditorRef.value, { // 初始模型 model: monaco.editor.createModel('', language), // 是否啟用預(yù)覽圖 minimap: { enabled: true }, // 圓角 roundedSelection: true, // 主題 theme: useCommonStore().mode == 'dark' ? 'vs-dark' : 'vs', // 主鍵 multiCursorModifier: 'ctrlCmd', // 滾動(dòng)條 scrollbar: { verticalScrollbarSize: 8, horizontalScrollbarSize: 8 }, // 行號(hào) lineNumbers: 'on', // tab大小 tabSize: 2, //字體大小 fontSize: 16, // 控制編輯器在用戶鍵入、粘貼、移動(dòng)或縮進(jìn)行時(shí)是否應(yīng)自動(dòng)調(diào)整縮進(jìn) autoIndent: 'advanced', // 自動(dòng)布局 automaticLayout: true, ...editorOption }) return monacoEditor } // 格式化 async function formatDoc() { await monacoEditor?.getAction('editor.action.formatDocument')?.run() } // 數(shù)據(jù)更新 function updateVal(val: string) { nextTick(() => { if(getOption(monaco.editor.EditorOption.readOnly)) { updateOptions({ readOnly: false }) } monacoEditor?.setValue(val) setTimeout(async () => { await formatDoc() }, 10) }) } // 配置更新 function updateOptions(opt: monaco.editor.IStandaloneEditorConstructionOptions) { monacoEditor?.updateOptions(opt) } // 獲取配置 function getOption(name: monaco.editor.EditorOption) { return monacoEditor?.getOption(name) } // 獲取實(shí)例 function getEditor() { return monacoEditor } // 頁(yè)面離開 銷毀 onBeforeUnmount(() => { if(monacoEditor) { monacoEditor.dispose() } }) return { monacoEditorRef, createEditor, getEditor, updateVal, updateOptions, getOption, formatDoc } }
然后調(diào)用上面 useMonacoEditor 封裝editor編輯器組件
@/components/MonacoEditor/index.vue
<template> <div ref="monacoEditorRef" :style="monacoEditorStyle"></div> </template> <script setup lang="ts"> import { useMonacoEditor } from '@/hooks' import { onMounted, computed, watch } from 'vue' const props = withDefaults(defineProps<{ width?: string | number, height?: string | number, language?: string, editorOption?: Object, modelValue: string }>(), { width: '100%', height: '100%', language: 'javascript', editorOption: () => ({}), modelValue: '' }) const emits = defineEmits<{ (e: 'blue'): void, (e: 'update:modelValue', val: string): void }>() const monacoEditorStyle = computed(() => { return { width: typeof props.width === 'string' ? props.width : props.width + 'px', height: typeof props.height === 'string' ? props.height : props.height + 'px' } }) const { monacoEditorRef, createEditor, updateVal, updateOptions, getEditor } = useMonacoEditor(props.language) onMounted(() => { const monacoEditor = createEditor(props.editorOption) updateMonacoVal(props.modelValue) monacoEditor?.onDidChangeModelContent(() => { emits('update:modelValue', monacoEditor!.getValue()) }) monacoEditor?.onDidBlurEditorText(() => { emits('blue') }) }) watch(() => props.modelValue, () => { updateMonacoVal(props.modelValue) }) function updateMonacoVal(val: string) { if(val !== getEditor()?.getValue()) { updateVal(val) } } defineExpose({ updateOptions }) </script>
組件使用:
<div class="edit-container"> <MonacoEditor ref="MonacoEditRef" v-model="editJson" language="json" /> </div> <script setup lang="ts"> import MonacoEditor from '@/components/MonacoEditor/index.vue' import { ref } from 'vue' let editJson = ref('') const MonacoEditRef = ref<InstanceType<typeof MonacoEditor>>() //MonacoEditRef.value!.updateOptions({ theme: 'vs' }) 調(diào)用子組件方法修改配置 </script>
到此這篇關(guān)于Vue3中使用Monaco-editor的教程詳解的文章就介紹到這了,更多相關(guān)Vue3使用Monaco-editor內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue渲染器如何對(duì)節(jié)點(diǎn)進(jìn)行掛載和更新
這篇文章主要介紹了Vue 的渲染器是如何對(duì)節(jié)點(diǎn)進(jìn)行掛載和更新的,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-05-05使用Vue和React分別實(shí)現(xiàn)錨點(diǎn)定位功能
這篇文章主要為大家詳細(xì)介紹了如何使用Vue和React分別實(shí)現(xiàn)錨點(diǎn)定位功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以學(xué)習(xí)一下2024-01-01vue3中reactive數(shù)據(jù)被重新賦值后無(wú)法雙向綁定的解決
這篇文章主要介紹了vue3中reactive數(shù)據(jù)被重新賦值后無(wú)法雙向綁定的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05vue實(shí)現(xiàn)類似淘寶商品評(píng)價(jià)頁(yè)面星級(jí)評(píng)價(jià)及上傳多張圖片功能
最近在寫一個(gè)關(guān)于vue的商城項(xiàng)目,然后集成在移動(dòng)端中,開發(fā)需求中有一界面,類似淘寶商城評(píng)價(jià)界面!接下來(lái)通過(guò)本文給大家分享vue實(shí)現(xiàn)類似淘寶商品評(píng)價(jià)頁(yè)面星級(jí)評(píng)價(jià)及上傳多張圖片功能,需要的朋友參考下吧2018-10-10關(guān)于vue利用postcss-pxtorem進(jìn)行移動(dòng)端適配的問(wèn)題
這篇文章主要介紹了關(guān)于vue利用postcss-pxtorem進(jìn)行移動(dòng)端適配的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11vue-cli創(chuàng)建的項(xiàng)目,配置多頁(yè)面的實(shí)現(xiàn)方法
下面小編就為大家分享一篇vue-cli創(chuàng)建的項(xiàng)目,配置多頁(yè)面的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03ElementUI時(shí)間選擇器限制選擇范圍disabledData的使用
本文主要介紹了ElementUI時(shí)間選擇器限制選擇范圍disabledData的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06