当前位置: 首页 > news >正文

Vue3使用Monaco-editor

Monaco-editor,一个vs code 编辑器,需要将其集成到项目。不说闲话了,直接上代码。 

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']})]})
}

封装: 

 首先先封装个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// 目标元素const monacoEditorRef = ref<HTMLElement | null>(null)// 创建实例function createEditor(editorOption: monaco.editor.IStandaloneEditorConstructionOptions = {}) {if(!monacoEditorRef.value) returnmonacoEditor = monaco.editor.create(monacoEditorRef.value, {// 初始模型model: monaco.editor.createModel('', language),// 是否启用预览图minimap: { enabled: true },// 圆角roundedSelection: true,// 主题theme: useCommonStore().mode == 'dark' ? 'vs-dark' : 'vs',// 主键multiCursorModifier: 'ctrlCmd',// 滚动条scrollbar: {verticalScrollbarSize: 8,horizontalScrollbarSize: 8},// 行号lineNumbers: 'on',// tab大小tabSize: 2,//字体大小fontSize: 16,// 控制编辑器在用户键入、粘贴、移动或缩进行时是否应自动调整缩进autoIndent: 'advanced',// 自动布局automaticLayout: true,...editorOption})return monacoEditor}// 格式化async function formatDoc() {await monacoEditor?.getAction('editor.action.formatDocument')?.run()}// 数据更新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)}// 获取实例function getEditor() {return monacoEditor}// 页面离开 销毁onBeforeUnmount(() => {if(monacoEditor) {monacoEditor.dispose()}})return {monacoEditorRef,createEditor,getEditor,updateVal,updateOptions,getOption,formatDoc}
}

然后调用上面 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' }) 调用子组件方法修改配置
</script>

相关文章:

Vue3使用Monaco-editor

Monaco-editor&#xff0c;一个vs code 编辑器&#xff0c;需要将其集成到项目。不说闲话了&#xff0c;直接上代码。 npm地址&#xff1a;https://www.npmjs.com/package/monaco-editor 中文文档&#xff1a;https://aydk.site/editor/ 安装&#xff1a; pnpm add monaco…...

java 根据ip获取到城市 GeoLite2-City.mmdb

本文可解决 根据ip定位获取不到问题&#xff0c;提供多种方式仅供参考&#xff1a; 1.选型 1.1 实现方式 Java可以实现IP地址解析和省市区信息查询&#xff0c;但是需要借助一些外部数据源或数据库来实现。常用的方法有以下几种&#xff1a; 1.1.1 本地文件解析 可以通过下…...

kaggle使用说明

kaggle kaggle使用参考1、kaggle目录2、kaggle上传本地文件后&#xff0c;如何不改代码就可运行3、已上传文件的修改3.1 重新上传3.2 重写文件 4、创建文件夹5、结果下载5.1 多文件&#xff1a;先打包再下载5.2 重定文件下载链接 kaggle使用参考 Kaggle 新手入门必看&#xff…...

BUUCTF FLAG 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 注意&#xff1a;请将 hctf 替换为 flag 提交&#xff0c;格式 flag{} 密文&#xff1a; 下载附件&#xff0c;得到一张.png图片。 解题思路&#xff1a; 1、因为附件是一张图片&#xff0c;先放到StegSolve中&…...

万物皆可“云” 从杭州云栖大会看数智生活的未来

文章目录 前言一、云栖渐进&#xff1a;一个科技论坛的变迁与互联网历史互联网创新创业飞天进化飞天智能驱动数字中国 二、2023云栖大会&#xff1a;云计算人工智能 玩出科技跨界新花样大会亮点重磅嘉宾热门展览算力馆人工智能馆产业创新馆 总结 前言 10月31日&#xff0c;202…...

LeetCode1518 换水问题

题目描述 超市正在促销&#xff0c;你可以用 numExchange 个空水瓶从超市兑换一瓶水。最开始&#xff0c;你一共购入了 numBottles 瓶水。 如果喝掉了水瓶中的水&#xff0c;那么水瓶就会变成空的。 给你两个整数 numBottles 和 numExchange &#xff0c;返回你 最多 可以喝…...

强大日志查看器,助力数据联动分析

前言 我们曾讨论过观测云查看器强大的查询筛选和搜索功能&#xff0c;能够帮助用户快速、精准地检索数据&#xff0c;定位故障问题&#xff08;参见《如何使用查看器筛选、搜索功能进行数据定位&#xff1f;》&#xff09;。除此之外&#xff0c;日志查看器不仅可以帮助我们收…...

HIBS一些简介

文章目录 距离发展&#xff1a;意义使用挑战安全IOT活动服务频带可行性频谱 距离 海拔约20KM的平流层中&#xff0c;国际电联无线电条例&#xff08;RR&#xff09;将HAPS定义为位于20-50公里高度和相对于地球的指定标称固定点的物体上的无线电台。 #高空平台作为IMT基站(HIB…...

OpenCV实现人脸关键点检测

目录 实现过程 1&#xff0c;代码解读 1.1 导入工具包 1.2导入所需图像&#xff0c;以及训练好的人脸预测模型 1.3 将 dlib 的关键点对象转换为 NumPy 数组&#xff0c;以便后续处理 1.4图像上可视化面部关键点 1.5# 读取输入数据&#xff0c;预处理 1.6进行人脸检测 1…...

300万美元!澳大利亚昆士兰州投资当地首家量子公司AQC

澳大利亚模拟量子电路公司&#xff08;AQC&#xff09;联合创始人 Tom Stace 教授和 Arkady Federov 副教授&#xff08;图片来源&#xff1a;网络&#xff09; 澳大利亚风险投资基金会Uniseed为澳大利亚昆士兰大学的两名教授提供了300万美元的资金&#xff0c;资助他们创办了…...

Android Studio打包AAR

注意 依赖的Android Studio版本为4.2.2 更高的Android Studio版本使用方法可能有所不同&#xff0c;gradle的版本和gradle plugins的版本都会影响使用方式。 基于此&#xff0c;本文只能作为参考&#xff0c;而不能作为唯一答案&#xff0c;如果要完全依赖本文&#xff0c;则…...

【Python基础知识四】控制语句

Python基础知识&#xff1a;控制语句 1 条件控制1.1 if语句1.2 match...case语句 2 循环语句2.1 for循环2.2 for...else语句2.3 while循环2.4 while 循环使用 else 语句2.5 无限循环2.6 break 和 continue 语句及循环中的 else 子句2.6.1 break语句2.6.2 continue语句 2.7 pass…...

Jmeter压测 —— 1秒发送1次请求

场景&#xff1a;有时候测试场景需要设置请求频率为一秒一次&#xff08;或几秒一次&#xff09;实现方法一&#xff1a;1、首先需要在线程组下设置循环次数&#xff08;可以理解为请求的次数&#xff09; 次数设置为请求300次&#xff0c;其中线程数跟时间自行设置 2、在设置…...

目标检测YOLO实战应用案例100讲-基于改进YOLOv4算法的自动驾驶场景 目标检测

目录 前言 国内外目标检测算法研究现状 传统目标检测算法的发展现状...

Spring Cloud智慧工地源码,利用计算机技术、互联网、物联网、云计算、大数据等新一代信息技术开发,微服务架构

智慧工地系统充分利用计算机技术、互联网、物联网、云计算、大数据等新一代信息技术&#xff0c;以PC端&#xff0c;移动端&#xff0c;设备端三位一体的管控方式为企业现场工程管理提供了先进的技术手段。让劳务、设备、物料、安全、环境、能源、资料、计划、质量、视频监控等…...

AI视频 | Runway的史诗级更新真的那么震撼吗?来看我的试用体验!

就在昨天&#xff0c;Runway&#xff0c;这个生成式AI的领头羊&#xff0c;正式在X上发布了他们史诗级更新 看下视频 【视频2】 这个确实看起来太棒了 注册个账号&#xff0c;看下效果咋样 地址百度哈&#xff0c;注册登录也比较方便 直接邮箱即可 不过我是直接google账号登录的…...

【动作模式识别】实现复合动作模式识别(离线控制模块)

一、思路 一般来说&#xff0c;要实现摸脸动作&#xff0c;需要采集手臂的以下肌肉的肌电信号&#xff1a; 肱二头肌&#xff1a;控制肘关节的屈曲肱三头肌&#xff1a;控制肘关节的伸展前臂屈肌群&#xff1a;控制手腕和手指的屈曲前臂伸肌群&#xff1a;控制手腕和手指的伸…...

Python基础学习009——类的封装

# 面向对象是一种编程思想,还有另一种是面向过程 # 面向过程,具体步骤的实现,所有功能都自己书写 # 面向对象,使用一个个工具(函数),帮助完成各项任务 # 类:对多个特性相同或相似的食物的统称,根据特征不同一个事物可以属于多个类 # 对象:由类实例化的一个事物,指代1个 # 类的组…...

前端开发和后端开发,你更倾向于哪一种?

作为一个Web开发者&#xff0c;你是否曾经面临过这样的选择&#xff1a;是专注于前端开发&#xff0c;还是转向后端开发&#xff1f;前端开发和后端开发是Web开发中的两个不同的领域&#xff0c;它们各有各的特点和优势&#xff0c;也各有各的挑战和难点。那么&#xff0c;你应…...

Selenium 基本功能

#driver.quit()from selenium import webdriver from selenium.webdriver.chrome.service import Service# 尝试传参 s Service("chromedriver.exe") driver webdriver.Chrome(services)driver.get(https://www.baidu.com/) input()#1/导入Selenium库 from seleniu…...

.NET 11 预览版1:CoreCLR 在 WebAssembly 上的全面集成与性能突破

摘要随着.NET 11 Preview 1 的正式发布&#xff0c;.NET 生态系统迎来了一次具有分水岭意义的基础架构演进。本次发布的核心亮点在于.NET 的 CoreCLR 运行时现在已经能够原生运行在 WebAssembly (WASM) 平台上。这是一个重大的技术突破&#xff0c;标志着微软在跨平台战略上的全…...

【Python异步I/O终极指南】:20年CTO亲授asyncio高并发实战心法,避开97%开发者踩过的12个致命陷阱

第一章&#xff1a;Python异步I/O的本质与演进脉络Python异步I/O并非简单的“多线程替代方案”&#xff0c;其本质是**在单线程内通过事件循环&#xff08;event loop&#xff09;协同调度I/O等待任务&#xff0c;避免CPU空转&#xff0c;实现高并发吞吐**。它依赖操作系统底层…...

别只把Text2SQL当玩具:结合Spring AI与DeepSeek,我们这样用它优化了内部报表系统

别只把Text2SQL当玩具&#xff1a;结合Spring AI与DeepSeek&#xff0c;我们这样用它优化了内部报表系统 当业务团队每天提出十几个动态报表需求时&#xff0c;传统开发模式就像用勺子舀干涸的井水——我们团队曾连续三个月被SQL编写和接口开发压得喘不过气。直到将Text2SQL技术…...

如何用CC Switch实现多AI服务统一管理与高可用架构

如何用CC Switch实现多AI服务统一管理与高可用架构 【免费下载链接】cc-switch A cross-platform desktop All-in-One assistant tool for Claude Code, Codex & Gemini CLI. 项目地址: https://gitcode.com/GitHub_Trending/cc/cc-switch 在现代AI开发工作流中&…...

aiofiles源码解析:从AsyncBase到线程池委托的完整实现

aiofiles源码解析&#xff1a;从AsyncBase到线程池委托的完整实现 【免费下载链接】aiofiles File support for asyncio 项目地址: https://gitcode.com/gh_mirrors/ai/aiofiles aiofiles 是一个专为异步文件操作设计的Python库&#xff0c;它巧妙地将阻塞式文件IO操作委…...

3大核心功能+2套实战流程:零基础掌握FreeCAD开源3D建模

3大核心功能2套实战流程&#xff1a;零基础掌握FreeCAD开源3D建模 【免费下载链接】FreeCAD This is the official source code of FreeCAD, a free and opensource multiplatform 3D parametric modeler. 项目地址: https://gitcode.com/GitHub_Trending/fr/freecad 3D…...

从零到一:构建智能AI代理的提示工程实战指南

从零到一&#xff1a;构建智能AI代理的提示工程实战指南 【免费下载链接】Prompt-Engineering-Guide dair-ai/Prompt-Engineering-Guide: 是一个用于指导对话人工智能开发的文档。适合用于学习对话人工智能开发和自然语言处理。特点是提供了详细的指南和参考资料&#xff0c;涵…...

OpenClaw+GLM-4.7-Flash智能书签:自动归档网页内容

OpenClawGLM-4.7-Flash智能书签&#xff1a;自动归档网页内容 1. 为什么需要智能书签管理 作为一个每天需要浏览大量技术文档和行业资讯的开发者&#xff0c;我发现自己陷入了"收藏即遗忘"的困境。Chrome书签栏里堆满了未分类的链接&#xff0c;Evernote里塞着杂乱…...

原创:华为大模型万卡训推一体破局方案

华为大模型万卡训推一体破局方案 作者&#xff1a;华夏之光永存 摘要&#xff1a;本文针对华为昇腾大模型算力集群面临的训推割裂、生态适配成本高、HBM显存被卡脖子、内部多部门对齐困难、客户规模化部署账算不清等行业核心痛点&#xff0c;提出一套先锁决策、再建架构、最后落…...

CentOS7服务器流量飙升?别慌,用iftop+nload快速揪出‘吃流量’的进程

CentOS7服务器流量异常排查实战&#xff1a;iftop与nload组合拳 深夜的告警铃声突然响起&#xff0c;监控系统显示某台核心业务服务器的带宽使用率飙升至95%。作为运维人员&#xff0c;这种场景并不陌生——可能是业务量激增&#xff0c;也可能是恶意攻击&#xff0c;或是某个失…...