CodeMirror 是一种非常强大的代码编辑器,它提供了许多对于 Vue.js 项目的开发非常有用的功能。如果您正在构建 Vue.js 项目并需要一个高效、灵活且易于使用的代码编辑器,则 CodeMirror 可能是您需要的工具之一。本文将向您介绍使用 vue-codemirror 为 Vue.js 项目搭建一个优秀的代码编辑环境,以便为 Vue 项目打造出高效且愉悦的开发体验。让我们一起开始构建一个强大的代码编辑环境吧!
安装依赖
CodeMirror 是一个基于Web技术的开源代码编辑器.
vue-codemirror 是一个基于 Vue.js 的代码编辑器组件,它集成了 CodeMirror 编辑器并提供了 Vue.js 组件化的封装
# 直接安装会安装最新版本,仅支持 Vue3.0
npm i codemirror vue-codemirror --save
# Vue2.0 中需要指定安装 4.x 版本
npm i codemirror vue-codemirror@4.x --save
导入
全局导入
import Vue from "vue";
import App from "./App";
// 导入与组件注册
import { codemirror } from "vue-codemirror";
Vue.component("codemirror", codemirror);
局部导入
// 导入
import { codemirror } from "vue-codemirror";
export default {
// 组件注册
components: { codemirror },
};
使用
基本应用
- 导入样式资源
// 编辑器所需要的样式文件
import 'codemirror/lib/codemirror.css'
// 语言模式:根据不同的代码语言引入不同的js
// 你可以到 node_modules/codemirror/mode/ 下寻找需要的文件
import "codemirror/mode/javascript/javascript"
// 主题样式:代码块的主题
// 你可以到 node_modules/codemirror/theme/ 下寻找需要的文件
import 'codemirror/theme/idea.css'
// 附加功能:某些高级功能需要引入额外的 js 文件
// 你可以在 node_modules/codemirror/addon 下查找
// 代码折叠
import 'codemirror/addon/fold/foldgutter.css'
// 激活行高亮
import "codemirror/addon/selection/active-line.js"
// 其他...
- 准备HTML元素和数据
<!-- 双向绑定 使用 v-model -->
<codemirror v-model="code" :options="cmOptions"></codemirror>
<!-- 单向绑定 使用 value , 通过 input 事件获取输入的内容 -->
<codemirror
:value="code"
:options="cmOptions"
@input="onCmCodeChange">
</codemirror>
- 配置项
data() {
return {
code: "",
cmOptions: {
// 语言模式
mode: "javascript",
// 主题
theme: "idea",
// 显示行号
lineNumbers: true,
// 自动缩进
smartIndent: true,
// 自动匹配括号
matchBrackets: true,
// 自动匹配引号
matchTags: true,
// 代码折叠
lineWrapping: true,
// 激活行高亮
styleActiveLine: true,
},
};
},
methods: {
onCmCodeChange(newCode) {
this.code = newCode;
},
},
资源介绍
关于配置项的一些常用总结:
分类 | 代码 | 说明 |
---|---|---|
mode | text/javascript | JavaScript |
text/html | HTML | |
text/css | CSS | |
application/xml | XML | |
application/json | JSON | |
text/x-python | Python | |
text/x-java | Java | |
text/x-ruby | Ruby | |
text/x-c++src | C++ | |
text/x-csharp | C# | |
theme | cobalt | cobalt |
dracula | dracula | |
monokai | monokai | |
idea | idea |
封装一个组件
下面是一个封装好的组件,拿去用吧 🎉 !
<template>
<div>
<codemirror ref="cm"
:value="codestr"
:options="cmOptions"
@input="onCmCodeChange">
</codemirror>
</div>
</template>
<script>
import { codemirror } from 'vue-codemirror'
import 'codemirror/lib/codemirror.css'
import "codemirror/mode/javascript/javascript"
import 'codemirror/theme/idea.css'
import 'codemirror/addon/fold/foldgutter.css"
import "codemirror/addon/selection/active-line.js"
export default {
name: "CodeBlock",
components: {
codemirror
},
props: {
codestr: {
type: String,
default: ""
},
codemode: {
type: String,
default: "json",
validator: function (value) {
return ['application/json'].includes(value);
}
},
codetheme: {
type: String,
default: "idea",
validator: function (value) {
return ['idea'].includes(value);
}
}
},
mounted() {
this.$refs.cm.codemirror.setSize("100%", 'auto');
},
computed: {
cmOptions() {
return {
mode: this.codemode,
theme: this.codetheme,
// 是否显示行号
lineNumbers: true,
// 是否自动换行
lineWrapping: true,
// 代码折叠
foldGutter: true,
// 沟槽样式,传入数组会按顺序依次应用
// 左侧是行号,行号右侧是折叠箭头
gutters: [
"CodeMirror-linenumbers",
"CodeMirror-foldgutter"
],
// 高亮选中的行
styleActiveLine: true,
};
}
},
data() {
return {
code: this.codestr
}
},
methods: {
getCurrentCode() {
return this.code;
},
onCmCodeChange(newCode) {
this.code = newCode;
},
},
}
</script>