Vue3代码展示(vue-codemirror)

可自定义设置以下属性:

  • 代码样式(codeStyle),类型:CSSProperties,默认 {}

  • 是否暗黑主题(dark),类型:boolean,默认 false

  • 代码字符串(code),类型:string,默认 ''

参考文档:

效果如下图:

①安装所需依赖:

yarn add codemirror vue-codemirror @codemirror/lang-vue @codemirror/theme-one-dark

②创建代码展示组件CodeMirror.vue:

<script setup lang="ts">
import type { CSSProperties } from 'vue'
import { ref, watchEffect } from 'vue'
import { Codemirror } from 'vue-codemirror'
import { vue } from '@codemirror/lang-vue'
import { oneDark } from '@codemirror/theme-one-dark'
interface Props {
  codeStyle?: CSSProperties // 代码样式
  dark?: boolean // 是否暗黑主题
  code?: string // 代码字符串
  // placeholder?: string // 占位文本
  // autofocus?: boolean // 自动聚焦
  // disabled?: boolean // 禁用输入行为和更改状态
  // indentWithTab?: boolean // 启用 tab 按键
  // tabSize?: number // tab 按键缩进空格数
  // autoDestroy?: boolean // 组件销毁时是否自动销毁代码编辑器实例
}
const props = withDefaults(defineProps<Props>(), {
  codeStyle: () => ({}),
  dark: false,
  code: ''
  // placeholder: 'Code goes here...',
  // autofocus: false,
  // disabled: false,
  // indentWithTab: true,
  // tabSize: 2
})
const extensions = props.dark ? [vue(), oneDark] : [vue()]
const codeValue = ref('')
watchEffect(() => {
  codeValue.value = props.code
})
const emits = defineEmits(['update:code', 'ready', 'change', 'focus', 'blur'])
function handleReady (payload: any) {
  // console.log('ready')
  emits('ready', payload)
}
function onChange (value: string, viewUpdate: any) {
  emits('change', value, viewUpdate)
  emits('update:code', value)
}
function onBlur (viewUpdate: any) {
  emits('blur', viewUpdate)
}
</script>
<template>
  <Codemirror
    v-model="codeValue"
    :style="codeStyle"
    :extensions="extensions"
    @ready="handleReady"
    @change="onChange"
    @focus="onFocus"
    @blur="onBlur"
    v-bind="$attrs"
  />
</template>
<style lang="less" scoped>
:deep(.cm-editor) {
  border-radius: 8px;
  outline: none;
  border: 1px solid transparent;
  .cm-scroller {
    border-radius: 8px;
  }
}
:deep(.cm-focused) {
  border: 1px solid fade(@themeColor, 48%);
}
</style>

③在要使用的页面引入:

<script setup lang="ts">
import CodeMirror from './CodeMirror.vue'
import { ref } from 'vue'
const code = ref(`<script setup lang="ts">
import { dateFormat, requestAnimationFrame, cancelAnimationFrame, rafTimeout, cancelRaf } from 'vue-amazing-ui'
<\/script>
`)
function onReady (payload: any) {
  console.log('ready', payload)
}
function onChange (value: string, viewUpdate: any) {
  console.log('change', value)
  console.log('change', viewUpdate)
}
function onFocus (viewUpdate: any) {
  console.log('focus', viewUpdate)
}
function onBlur (viewUpdate: any) {
  console.log('blur', viewUpdate)
}
</script>
<template>
  <div>
    <h1>vue-codemirror 参考文档</h1>
    <ul class="m-list">
      <li>
        <a class="u-file" href="https://www.npmjs.com/package/vue-codemirror" target="_blank">vue-codemirror 插件</a>
      </li>
      <li>
        <a class="u-file" href="https://codemirror.net/" target="_blank">CodeMirror 官网</a>
      </li>
      <li>
        <a class="u-file" href="https://codemirror.net/docs/ref/" target="_blank">CodeMirror6 APIs</a>
      </li>
      <li>
        <a class="u-file" href="https://github.com/orgs/codemirror/repositories?q=lang-&type=all" target="_blank">CodeMirror6 Languages</a>
      </li>
      <li>
        <a class="u-file" href="https://github.com/orgs/codemirror/repositories?q=theme&type=all" target="_blank">CodeMirror6 Themes</a>
      </li>
    </ul>
    <h2 class="mt30 mb10">Codemirror</h2>
    <CodeMirror
      v-model:code="code"
      dark
      :codeStyle="{ width: '1000px', height: '500px', fontSize: '16px' }"
      @ready="onReady"
      @change="onChange"
      @focus="onFocus"
      @blur="onBlur" />
  </div>
</template>
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

theMuseCatcher

您的支持是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值