codemirror封装,可以像textareay进行高度调节

一、封装code.vue

<template>
  <div class="am-code">
    <codemirror ref="codeRef" v-model:value="cmCode" :options="cmOptions" :electricChars="false" @ready="onCmReady" class="mirror" :style="cmHeight"></codemirror>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref, onMounted, onUpdated, watch, nextTick, computed } from 'vue'
import Codemirror from 'codemirror-editor-vue3'
import 'codemirror/addon/display/autorefresh.js' // 显示自动刷新
import 'codemirror/addon/lint/json-lint.js'
import 'codemirror/addon/lint/lint.js'
import 'codemirror/addon/lint/lint.css'
import 'codemirror/addon/selection/active-line.js' //高亮行功能
import 'codemirror/lib/codemirror.css'
import 'codemirror/mode/javascript/javascript.js'
import 'codemirror/mode/sql/sql.js' //语言模式
import 'codemirror/theme/cobalt.css' //主题
import 'codemirror/theme/rubyblue.css'

export default defineComponent({
  name: 'AmCode',
  components: { Codemirror },
  props: {
    code: {
      type: String,
      default: ''
    },
    theme: {
      type: String,
      default: 'cobalt' //cobalt黑色背景 idea白色背景 dracula透明
    },
    height: {
      type: String,
      default: '100px'
    },
  },
  // emits: ['onCmReady'],
  setup(props, { emit }) {
    const codeRef = ref()
    const cmCode = ref(props.code)
    const cmTheme = ref(props.theme)
    const cmOptions = {
      mode: 'text/x-mysql',
      theme: cmTheme.value,
      styleActiveLine: true,
      autoRefresh: true,
      lint: true,
      // gutters: ['CodeMirror-lint-markers'],
      lineNumbers: true,
      indentWithTabs: true,
      smartIndent: true,
      // 软换行
      lineWrapping: true,
      // 自动括号匹配功能
      matchBrackets: true,
      // tab宽度
      tabSize: 2
    }
    const onCmReady = (params: any) => {
      emit('onCmReady', params)
    }
    const codeRefresh = () => {
      codeRef.value.cminstance.refresh()
    }

    onMounted(() => {
      codeRefresh()
    })
    onUpdated(() => {
      emit('update:code', cmCode)
    })
    const cmHeight = computed(() => {
      return  {'--code-height': props.height}
    })
    return { cmCode, cmTheme, cmOptions, codeRef, onCmReady, codeRefresh, cmHeight}
  }
})
</script>
<style scoped lang="scss">
.am-code {
  width: 100%;
  display: contents;
  overflow: auto !important;
  .mirror {
    resize: vertical;
    overflow: auto !important;
  }
  .codemirror-container{
    height: var(--code-height);
  }
}
</style>

二、导出组件文件index.ts

import { App } from 'vue'
import Code from './src/code.vue'

// 定义 install 方法, App 作为参数
const install = (app: App): void => {
  app.component(Code.name, Code)
}

export default { install }

三、使用

<am-code v-model:code="dataForm.executeSql" height="120px"></am-code>

四、踩坑

一个项目中同时存在codeMirror与富文本编辑器时,先加载富文本编辑器后使用codeMirror时,codeMirror样式会受影响,因为富文本编辑器中也存在codemirror.css,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值