Vue3代码展示(vue-codemirror)

文章介绍了如何在Vue项目中使用vue-codemirror插件来创建一个可自定义的代码编辑器。通过安装相关依赖,创建CodeMirror组件,并设置代码样式、暗黑主题和代码字符串等属性。在使用页面引入组件并监听各种事件,如ready、change、focus和blur。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可自定义设置以下属性:

  • 代码样式(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>
Vue 3 项目中集成和使用 `vue-codemirror` 组件,可以实现代码编辑器的功能。以下是具体的步骤和示例代码: ### 安装依赖 首先需要安装 `vue-codemirror` 包以及相关的语言扩展包。可以通过以下命令进行安装: ```bash npm install vue-codemirror codemirror @codemirror/lang-javascript @codemirror/lang-python ``` ### 引入组件和样式 在 Vue 组件中引入所需的模块,并注册 `Codemirror` 组件。同时需要引入 CodeMirror 的基础样式。 ```vue <script setup> import { Codemirror } from &#39;vue-codemirror&#39; import { ref, watch } from &#39;vue&#39; import { javascript } from &#39;@codemirror/lang-javascript&#39; import { python } from &#39;@codemirror/lang-python&#39; const code = ref(&#39;console.log("Hello World")&#39;) const language = ref(&#39;javascript&#39;) const lang = { javascript: javascript(), python: python() }[language.value] watch(language, (newVal) => { // 切换语言时更新编辑器的语言模式 codeEditor.value?.setOption(&#39;mode&#39;, lang[newVal]) }) </script> <template> <div> <select v-model="language"> <option value="javascript">JavaScript</option> <option value="python">Python</option> </select> <codemirror v-model="code" :extensions="lang" /> </div> </template> <style> @import &#39;codemirror/lib/codemirror.css&#39;; </style> ``` ### 功能说明 - **Codemirror 组件**:通过 `v-model` 绑定代码内容,使用 `extensions` 属性来指定当前支持的语言扩展。 - **语言切换**:通过下拉框选择不同的编程语言,动态改变 `lang` 对象中的值,并更新编辑器的语言模式[^2]。 - **样式导入**:确保引入了 `codemirror.css` 样式文件以获得良好的用户体验。 ### 自定义配置 可以根据需求进一步自定义 CodeMirror 的行为,例如设置主题、启用行号显示等。这些配置可以通过传递额外的属性给 `Codemirror` 组件来完成。 ```vue <codemirror v-model="code" :extensions="lang" :options="{ lineNumbers: true, theme: &#39;dracula&#39; }" /> ``` 以上就是在 Vue 3 中集成和使用 `vue-codemirror` 组件的方法及示例。通过这种方式,可以在 Web 应用程序中提供一个功能丰富的代码编辑界面。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

theMuseCatcher

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

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

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

打赏作者

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

抵扣说明:

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

余额充值