[转]vue-codemirror 代码编辑器

 

codemirror 是一个非常强大的代码编辑器插件,但官方并没有提供 vue 的支持版本,不过跟 vue 集成的步骤并不复杂,以下是具体实现

 

更多精彩

 

  • 更多技术博客,请移步 IT人才终生实训与职业进阶平台 - 实训在线

 

相关网址

 

  1. Vue 官方插件库推荐的集成实现
    • 这个实现做的比较全面,但不支持动态语法高亮的切换
  2. codemirror 支持的语言类型
  3. codemirror 官网

 

实现效果

 

 

具体实现

 

  1. 首先需要运行 npm i codemirror --save 在项目中安装对应组件

 

<template><div class="in-coder-panel"><textarea ref="textarea"></textarea><el-select class="code-mode-select" v-model="mode"@change="changeMode"><el-option v-for="mode in modes":key="mode.value" :label="mode.label" :value="mode.value"></el-option></el-select></div>
</template><script type="text/ecmascript-6">// 引入全局实例import _CodeMirror from 'codemirror'// 核心样式import 'codemirror/lib/codemirror.css'// 引入主题后还需要在 options 中指定主题才会生效import 'codemirror/theme/cobalt.css'// 需要引入具体的语法高亮库才会有对应的语法高亮效果// codemirror 官方其实支持通过 /addon/mode/loadmode.js 和 /mode/meta.js 来实现动态加载对应语法高亮库// 但 vue 貌似没有无法在实例初始化后再动态加载对应 JS ,所以此处才把对应的 JS 提前引入import 'codemirror/mode/javascript/javascript.js'import 'codemirror/mode/css/css.js'import 'codemirror/mode/xml/xml.js'import 'codemirror/mode/clike/clike.js'import 'codemirror/mode/markdown/markdown.js'import 'codemirror/mode/python/python.js'import 'codemirror/mode/r/r.js'import 'codemirror/mode/shell/shell.js'import 'codemirror/mode/sql/sql.js'import 'codemirror/mode/swift/swift.js'import 'codemirror/mode/vue/vue.js'// 尝试获取全局实例const CodeMirror = window.CodeMirror || _CodeMirrorexport default {name: 'in-coder',props: {// 外部传入的内容,用于实现双向绑定value: String,// 外部传入的语法类型language: {type: String,default: null}},data () {return {// 内部真实的内容code: '',// 默认的语法类型mode: 'javascript',// 编辑器实例coder: null,// 默认配置options: {// 缩进格式tabSize: 2,// 主题,对应主题库 JS 需要提前引入theme: 'cobalt',// 显示行号lineNumbers: true,line: true},// 支持切换的语法高亮类型,对应 JS 已经提前引入// 使用的是 MIME-TYPE ,不过作为前缀的 text/ 在后面指定时写死了modes: [{value: 'css',label: 'CSS'}, {value: 'javascript',label: 'Javascript'}, {value: 'html',label: 'XML/HTML'}, {value: 'x-java',label: 'Java'}, {value: 'x-objectivec',label: 'Objective-C'}, {value: 'x-python',label: 'Python'}, {value: 'x-rsrc',label: 'R'}, {value: 'x-sh',label: 'Shell'}, {value: 'x-sql',label: 'SQL'}, {value: 'x-swift',label: 'Swift'}, {value: 'x-vue',label: 'Vue'}, {value: 'markdown',label: 'Markdown'}]}},mounted () {// 初始化this._initialize()},methods: {// 初始化_initialize () {// 初始化编辑器实例,传入需要被实例化的文本域对象和默认配置this.coder = CodeMirror.fromTextArea(this.$refs.textarea, this.options)// 编辑器赋值this.coder.setValue(this.value || this.code)// 支持双向绑定this.coder.on('change', (coder) => {this.code = coder.getValue()if (this.$emit) {this.$emit('input', this.code)}})// 尝试从父容器获取语法类型if (this.language) {// 获取具体的语法类型对象let modeObj = this._getLanguage(this.language)// 判断父容器传入的语法是否被支持if (modeObj) {this.mode = modeObj.label}}},// 获取当前语法类型_getLanguage (language) {// 在支持的语法类型列表中寻找传入的语法类型return this.modes.find((mode) => {// 所有的值都忽略大小写,方便比较let currentLanguage = language.toLowerCase()let currentLabel = mode.label.toLowerCase()let currentValue = mode.value.toLowerCase()// 由于真实值可能不规范,例如 java 的真实值是 x-java ,所以讲 value 和 label 同时和传入语法进行比较return currentLabel === currentLanguage || currentValue === currentLanguage})},// 更改模式changeMode (val) {// 修改编辑器的语法配置this.coder.setOption('mode', `text/${val}`)// 获取修改后的语法let label = this._getLanguage(val).label.toLowerCase()// 允许父容器通过以下函数监听当前的语法值this.$emit('language-change', label)}}}
</script><style lang="stylus" rel="stylesheet/stylus">.in-coder-panelflex-grow 1display flexposition relative.CodeMirrorflex-grow 1z-index 1.CodeMirror-codeline-height 19px.code-mode-selectposition absolutez-index 2right 10pxtop 10pxmax-width 130px
</style>


---------------------
作者:asing1elife
来源:CSDN
原文:https://blog.csdn.net/asing1elife/article/details/89249154
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言试题139之输入 3 个数 a,b,c,按大小顺序输出(利用指针)

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:输入 3 个数 a,b,c,按大小顺…

【ArcGIS Pro微课1000例】0001:Win7系统ArcGIS Pro2.5安装权威教程(附软件安装包下载)

ArcGIS Pro是ESRI桌面产品线的新秀,集很多新技术于一身,原生支持64位系统,Ribbon界面,支持二三维一体化等。可以与别的版本的ArcGIS软件共存。 文章目录 1. 系统环境配置2. 安装ArcGIS pro3. 打补丁,登录账户4. 安装中文5. ArcGIS pro 2.5下载地址1. 系统环境配置 ࿰

Maven发布工程到私服

所谓发布工程就是把工程打包成jar包&#xff0c;然后选择上传到私服的某个仓库里&#xff0c;然后其他人就可以在私服上的仓库中下载到你发布的工程。 简单介绍Nexus上自带的一些仓库&#xff1a; 如果想要发布工程是需要一个拥有发布权限的用户的&#xff0c;没有发布权限的游…

善用兵者,藏于无形,90 分钟深度讲解最佳推广价值作品

&#x1f4a1;提示本文带有极大的主观色彩&#xff0c;及不代表微软组织的可视化大赛观点&#xff0c;也不代表作者本人观点。全部解读均为这里的独到观点&#xff0c;任何解释错误与作者或大赛无关。没有作品文件下载&#xff0c;全文仅从外观推断和赏析整个结构。如果你已经被…

C语言试题140之输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:输入数组,最大的与第一个元…

【ArcGIS Pro微课1000例】0003:ArcGIS pro 2.5加载OSGB点云模型案例教程

Esri采用的spk i3s标准(Indexed 3D Scene),是Esri推出的开放标准。I3S标准作为开放的标准已经得到了市面上主流的倾斜摄影测量建模软件的支持,如Bentley的 ContextCapture(国内简称为Smart 3D)、Pix4D、Vricon,这些软件均支持基于I3S标准的数据格式SLPK的导出,生成的SLP…

机器学习 vs. 深度学习

1. bias/vairance Trend # 1&#xff1a;Scale driving Deep Learning process. 2. feature learning 的方式 A common computer vision pipeline before 2012&#xff1a; a. find interest points.b. crop patches around them.c. represent each patch with a sparse local …

多图片上传预览效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><script src"jquery-2.1.4.min.js"></script> </head> <body><script>//下面用于多图…

C语言试题141之有 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m 个数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:有 n 个整数,使其前面各数顺…

dotnet-exec 0.6.0 released

dotnet-exec 0.6.0 releasedIntrodotnet-exec 是一个 C# 程序的小工具&#xff0c;可以用来运行一些简单的 C# 程序而无需创建项目文件&#xff0c;而且可以自定义项目的入口方法&#xff0c;支持但不限于 Main 方法Install/Updatedotnet-exec 是一个 dotnet tool&#xff0c;可…

VS Code 集成 flutter dart 开发

一、关于Flutter Flutter是谷歌的移动UI框架&#xff0c;可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界&#xff0c;Flutter正在被越来越多的开发者和组织使用&#xff0c;并且Flutter是完全免费、开源的。 https://flutterc…

【ArcGIS Pro微课1000例】0004:ArcGIS pro 2.5快速批量制作中国分省地图(建议收藏)

ArcGIS Pro 提供了基于单个布局创建一系列布局页面的功能,与 ArcMap 中的数据驱动页面功能类似,但在 ArcGIS Pro 中,术语“地图系列”用于描述 该功能。动态文本是指放置在地图布局中且随地图文档、数据框和数据驱动页面的当前属性而动态变化的文本。本文讲述采用动态文本来…

C语言试题142之有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出 圈子,问最后留下的是原来第几号的那位。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:有 n 个人围成一圈,顺序排号…

eclipse如何调试(Debug)程序(zhuan)

http://jingyan.baidu.com/article/e6c8503c7e46b6e54f1a18c5.html ******************************************* 我们在编写java程序的过程中&#xff0c;经常会遇到各种莫名其妙的问题&#xff0c;为了检测程序是哪里出现问题&#xff0c;经常需要增加日志&#xff0c;看变量…

WPF效果第一百九十一篇之框选ListBox

前面效果中基于ListBox实现了一点不一样的效果;今天再次在原来的基础上完善框选ListBox;最终实现的效果,如下图:1、使用了VisualTreeHelper的HitTest方法:Point point2 e.GetPosition(LedListBox);Rect rect new Rect(origContentMouseDownPoint, point2);RectangleGeometry …

epoll socket 服务端中read和write的返回值讨论

2019独角兽企业重金招聘Python工程师标准>>> 先贴一段代码&#xff0c;代码很简单要看过epoll如何使用&#xff0c;都应该能看懂。 这是服务端程序&#xff1a; #include <sys/socket.h> #include <sys/epoll.h> #include <netinet/in.h> #includ…

异常处理—错误抛出机制

错误抛出机制&#xff1a; 把可能出现异常的代码写在try{}里&#xff0c;使用catch(){}设置一些异常陷阱来捕获异常。例如&#xff1a; 没有异常处理时异常的抛出机制&#xff1a; 为什么出现异常会在控制台上显示打印红色的异常呢&#xff1f;这是因为其实main方法外面还有一个…

【ArcGIS Pro风暴】Data Interoperability Tools快速将CASS等高线dwg转为shp案例教程

ArcGSI提供了多种将cass制作的dwg格式的地形图数据转为shp矢量格式。在ArcMap中的转换方法可以参考: CAD格式数据转ArcGIS数据方法总结,本文以案例的形式,讲解在ArcGIS Pro2.5中如何借助Data Interoperability Tools中的Quick Import工具将dwg格式的等高线完美转换为shp,转…

.Net 之时间轮算法(终极版)

关于时间轮算法的起始我也认真的看了时间轮算法相关&#xff0c;大致都是如下的一个图在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述个人认为的问题大部分文章在解释这个为何用时间轮的时候都再说假设我们现在有一个很大的数组&#xff0c;专门用…

C语言试题143之写一个函数,求一个字符串的长度,在 main 函数中输入字符串,并输出其长度

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:写一个函数,求一个字符串的…