vue-codemirror
基于 CodeMirror ,适用于 Vue 的 Web 代码编辑器。(这里使用的 vue3)
演示效果
版本说明
- "vue-codemirror": "^6.1.1"
- "@codemirror/lang-javascript": "^6.1.9"
- "@codemirror/lang-sql": "^6.5.4"
- "sql-formatter": "^2.3.4",
安装 vue-codemirror
- 命令行安装
npm install vue-codemirror --save
使用 sql/javascript 语言的代码编辑器
- 命令行安装
npm install @codemirror/lang-sql
npm install @codemirror/lang-javascript
主题
- 如果想要黑色编辑器的主题, 可在命令行安装
npm i @codemirror/theme-one-dark
封装 SqlCodeEdit.vue 组件
配置说明
对 SQL 代码进行格式化/清空功能
- npm 安装 sql-formatter 插件
npm install sql-formatter --save
- 引入该 sql-formatter.js 文件
import sqlFormatter from 'sql-formatter';
- 使用方法
//代码格式化
const formatSql = () => {
sqlCode.value=sqlFormatter.format(sqlCode.value)
}
// 清除值
const clearVal = () => {
sqlCode.value=''
}
SqlCodeEdit 组件完整代码
<template>
<codemirror
v-model="sqlCode"
:placeholder="editorPlaceholder"
:style="{ height: editorHeight+'px' }"
:autofocus="true"
:indent-with-tab="true"
:tabSize="tabSize"
:extensions="extensions"
:scrollbarStyle="null"
@change="emit('change',$event)"
/>
<div class="sql-format">
<span @click="formatSql">格式化 SQL</span>
<span @click="clearVal">一键清空</span>
</div>
</template>
<script setup>
import {Codemirror} from "vue-codemirror";
import {sql} from '@codemirror/lang-sql';
import {defineEmits, ref, defineProps, computed} from "vue";
import * as sqlFormatter from "sql-formatter";
const emit = defineEmits()
const props = defineProps({
value: {
type: String,
default: "",
},
editorPlaceholder: {
type: String,
default: "请输入代码",
},
editorHeight: {
type: String,
default: "300",
},
tabSize: {
type: Number,
default: 2,
}
})
const _value = computed({
get() {
return props.value || ""
},
set(value) {
emit('update:value', value)
}
})
const sqlCode = ref();
const extensions = ref([sql()]);
//代码格式化
const formatSql = () => {
sqlCode.value=sqlFormatter.format(sqlCode.value)
}
// 清除值
const clearVal = () => {
sqlCode.value=''
}
</script>
<style scoped lang="scss">
.sql-format {
background-color: #f7f7f7;
text-align: right;
color: #2a99ff;
padding: 10px;
span:hover {
cursor: pointer;
text-decoration: underline;
}
> span:first-child {
margin-right: 10px;
}
}
</style>
父组件调用 SqlCodeEdit 组件
<template>
<div class="code-editor">
<sql-code-edit v-model="sqlCode" :editor-placeholder="'请输入 sql 语句进行查询'"
:editor-height="300" :tab-size="4" @change="changeSqlCode"/>
</div>
</template>
<script setup>
import SqlCodeEdit from "@/components/codeEdit/SqlCodeEdit.vue";
const sqlCode = ref('')
//实时获取 sql 语句
const changeSqlCode = (val) => {
sqlCode.value = val
}
</script>
<style lang="scss" scoped>
.code-editor {
border: 1px solid #b3b3b3;
border-radius: 10px;
overflow: hidden;
margin-bottom: 10px;
}
</style>
JavaScript 代码编辑器
- 只需要引入及将 extensions 改为 javascript()即可
import {javascript} from "@codemirror/lang-javascript";
const extensions = ref(javascript());
JsCodeEdit 完整代码
<template>
<codemirror
v-model="sqlCode"
:placeholder="editorPlaceholder"
:style="{ height: editorHeight+'px' }"
:autofocus="true"
:indent-with-tab="true"
:tabSize="tabSize"
:extensions="extensions"
:scrollbarStyle="null"
/>
</template>
<script setup>
import {Codemirror} from "vue-codemirror";
import {javascript} from "@codemirror/lang-javascript";
import {defineEmits, ref, defineProps, computed} from "vue";
const emit = defineEmits()
const props = defineProps({
value: {
type: String,
default: "",
},
editorPlaceholder: {
type: String,
default: "请输入代码",
},
editorHeight: {
type: String,
default: "300",
},
tabSize: {
type: Number,
default: 2,
}
})
const _value = computed({
get() {
return props.value || ""
},
set(value) {
emit('update:value', value)
}
})
const sqlCode = ref();
const extensions = ref(javascript());
</script>
父组件调用 JsCodeEdit 组件
<js-code-edit v-model="config.http.fail" :editor-placeholder="'请输入 js 代码'" :editor-height="250" :tab-size="2"/>
import JsCodeEdit from "@/components/codeEdit/JsCodeEdit.vue";

