Deng
Deng
vue3使用vue-codemirror插件实现代码编辑器 | odjBlog
    欢迎来到odjBlog的博客!

vue3使用vue-codemirror插件实现代码编辑器

技术总结及问题解决 odjbin 2年前 (2023-08-12) 65次浏览 0个评论

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";

这样我就在 vue3 中使用 vue-codemirror 插件实现代码编辑器

喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
已稳定运行:3年255天3小时56分