【vue-codemirror】Vue中强大的编辑器插件--vue-codemirror

写在前面:

我手里有个项目,近期有想接活的小伙伴可以来了解一下。项目需求我放giithub上了。

github.com/yuhan-9527/coder2retire

在Vue中如何使用CodeMirror插件

CodeMirror是一个功能强大的Web代码编辑器,广泛应用于各种Web应用中。在Vue3项目中集成CodeMirror,可以显著提升代码编辑和展示的用户体验。本文将结合实际案例,详细介绍在Vue3中使用CodeMirror插件的方法。

一、安装CodeMirror插件

首先,我们需要安装CodeMirror相关的插件。在Vue3项目中,可以通过npm或yarn进行安装。

  1. 安装vue-codemirror包

    css 复制代码
    npm install vue-codemirror --save

    或者

    csharp 复制代码
    yarn add vue-codemirror
  2. 安装语言支持包

    如果你需要支持特定的编程语言,比如JavaScript,可以安装对应的语言包。

    css 复制代码
    npm i @codemirror/lang-javascript

    或者

    sql 复制代码
    yarn add @codemirror/lang-javascript
  3. 安装主题包

    CodeMirror提供了多种主题,你可以选择自己喜欢的主题进行安装。例如,安装One Dark主题:

    css 复制代码
    npm i @codemirror/theme-one-dark

    或者

    sql 复制代码
    yarn add @codemirror/theme-one-dark

二、创建CodeMirror组件

接下来,我们需要在Vue3项目中创建一个CodeMirror组件,用于代码编辑和展示。

  1. 新建组件mirrorTextArea.vue

    xml 复制代码
    <template>
      <codemirror
        v-model="code"
        placeholder="Code goes here..."
        :style="{ height: '100%' }"
        :autofocus="true"
        :tabSize="2"
        :extensions="extensions"
      />
    </template>
    
    <script lang="ts" setup>
    import { Codemirror } from "vue-codemirror";
    import { javascript } from "@codemirror/lang-javascript";
    import { oneDark } from "@codemirror/theme-one-dark";
    import { ref } from "vue";
    import { EditorView } from "@codemirror/view";
    
    let myTheme = EditorView.theme({
      "&": { color: "#0052D9", backgroundColor: "#FFFFFF" },
      ".cm-content": { caretColor: "#0052D9" },
      ".cm-activeLine": { backgroundColor: "#FAFAFA" },
      ".cm-activeLineGutter": { backgroundColor: "#FAFAFA" },
      "&.cm-focused .cm-cursor": { borderLeftColor: "#0052D9" },
      "&.cm-focused .cm-selectionBackground, ::selection": {
        backgroundColor: "#0052D9",
        color: "#FFFFFF"
      },
      ".cm-gutters": { backgroundColor: "#FFFFFF", color: "#ddd", border: "none" }
    }, { dark: true });
    
    interface IProps {
      height?: string;
    }
    
    const props = withDefaults(defineProps<IProps>(), { height: '400px' });
    const code = ref('');
    const extensions = [javascript(), myTheme];
    
    const change = () => {
      // 可以在这里添加代码变化时的处理逻辑
    };
    </script>
    
    <style scoped>
    /* 可以在这里添加组件的样式 */
    </style>

    在这个组件中,我们使用了vue-codemirror提供的Codemirror组件,并通过v-model指令实现了双向数据绑定。我们还设置了编辑器的一些基本属性,如自动聚焦、制表符大小等,并添加了JavaScript语言支持和自定义的One Dark主题。

  2. 在父组件中使用mirrorTextArea组件

    现在,我们可以在父组件中使用mirrorTextArea组件来展示代码编辑器。

    xml 复制代码
    <template>
      <div>
        <mirrorTextArea :height="editorHeight" />
      </div>
    </template>
    
    <script lang="ts" setup>
    import { ref } from "vue";
    import mirrorTextArea from "./components/mirrorTextArea.vue";
    
    const editorHeight = ref('600px');
    </script>
    
    <style scoped>
    /* 可以在这里添加父组件的样式 */
    </style>

    在这个例子中,我们将mirrorTextArea组件的高度设置为600px,并通过:height属性传递给子组件。

三、配置CodeMirror编辑器

CodeMirror编辑器提供了丰富的配置选项,可以满足不同的需求。接下来,我们将介绍一些常用的配置选项。

  1. 设置编辑器高度和宽度

    可以通过内联样式或CSS类来设置编辑器的高度和宽度。

    ini 复制代码
    <codemirror
      v-model="code"
      :style="{ height: '400px', width: '600px' }"
      placeholder="Code goes here..."
      :autofocus="true"
      :tabSize="2"
      :extensions="extensions"
    />
  2. 设置语言模式

    CodeMirror支持多种编程语言,可以通过设置mode属性来选择语言模式。

    ini 复制代码
    <codemirror
      v-model="code"
      :style="{ height: '400px' }"
      placeholder="Code goes here..."
      :autofocus="true"
      :tabSize="2"
      :extensions="[javascript(), oneDark]"
      mode="text/javascript"
    />

    在这个例子中,我们将编辑器设置为JavaScript模式。

  3. 设置主题

    可以通过设置extensions属性来应用主题。

    ini 复制代码
    <codemirror
      v-model="code"
      :style="{ height: '400px' }"
      placeholder="Code goes here..."
      :autofocus="true"
      :tabSize="2"
      :extensions="[javascript(), oneDark]"
    />

    在这个例子中,我们应用了One Dark主题。

  4. 设置自动聚焦

    可以通过设置autofocus属性来使编辑器在页面加载时自动聚焦。

    ini 复制代码
    <codemirror
      v-model="code"
      :style="{ height: '400px' }"
      placeholder="Code goes here..."
      :autofocus="true"
      :tabSize="2"
      :extensions="[javascript(), oneDark]"
    />
  5. 设置制表符大小

    可以通过设置tabSize属性来设置制表符的大小(以空格为单位)。

    ini 复制代码
    <codemirror
      v-model="code"
      :style="{ height: '400px' }"
      placeholder="Code goes here..."
      :autofocus="true"
      :tabSize="4"
      :extensions="[javascript(), oneDark]"
    />
  6. 设置占位符

    可以通过设置placeholder属性来显示占位符文本。

    ini 复制代码
    <codemirror
      v-model="code"
      :style="{ height: '400px' }"
      placeholder="Enter your code here..."
      :autofocus="true"
      :tabSize="2"
      :extensions="[javascript(), oneDark]"
    />
  7. 禁用编辑器

    可以通过设置disabled属性来禁用编辑器,使其变为只读状态。

    ini 复制代码
    <codemirror
      v-model="code"
      :style="{ height: '400px' }"
      placeholder="Code goes here..."
      :autofocus="true"
      :tabSize="2"
      :extensions="[javascript(), oneDark]"
      :disabled="true"
    />
  8. 监听事件

    CodeMirror提供了多种事件,如changeinputready等,可以通过监听这些事件来处理编辑器中的变化。

    ini 复制代码
    <codemirror
      v-model="code"
      :style="{ height: '400px' }"
      placeholder="Code goes here..."
      :autofocus="true"
      :tabSize="2"
      :extensions="[javascript(), oneDark]"
      @change="handleChange"
      @input="handleInput"
      @ready="handleReady"
    />
    
    <script lang="ts" setup>
    import { ref } from "vue";
    
    const code = ref('');
    
    const handleChange = (value: string, viewUpdate: any) => {
      console.log('Code changed:', value);
    };
    
    const handleInput = (value: string) => {
      console.log('Code input:', value);
    };
    
    const handleReady = (editor: any) => {
      console.log('Editor is ready:', editor);
    };
    </script>
相关推荐
开开心心就好8 小时前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
Setsuna_F_Seiei10 小时前
前端转型 Agent 开发 05 之 Agent Hooks 与 Checkpointer(让 Agent 从全自动转变人为可掌控)
前端·agent·ai编程
百万蹄蹄向前冲12 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙12 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan13 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen13 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理14 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒15 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche150015 小时前
利用 RAG 为答疑机器人扩展知识范围
前端
天若有情67315 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具