文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

vue codemirror如何实现在线代码编译器

2023-06-22 06:55

关注

vue codemirror如何实现在线代码编译器,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

前言

如果我们想在Web端实现在线代码编译的效果,那么需要使用组件vue-codemirror,他是将CodeMirror进行了再次封装

环境准备

npm install jshintnpm install jsonlintnpm install script-loadernpm install vue-codemirror

封装组件

我们可以在项目中的components中将vue-codemirror进行再次封装

<template>  <codemirror    ref="myCm"    v-model="editorValue"    :options="cmOptions"    @changes="onCmCodeChanges"    @blur="onCmBlur"    @keydown.native="onKeyDown"    @mousedown.native="onMouseDown"    @paste.native="OnPaste"  >  </codemirror></template><script>import { codemirror } from "vue-codemirror";import 'codemirror/keymap/sublime'import "codemirror/mode/javascript/javascript.js";import "codemirror/mode/xml/xml.js";import "codemirror/mode/htmlmixed/htmlmixed.js";import "codemirror/mode/css/css.js";import "codemirror/mode/yaml/yaml.js";import "codemirror/mode/sql/sql.js";import "codemirror/mode/python/python.js";import "codemirror/mode/markdown/markdown.js";import "codemirror/addon/hint/show-hint.css";import "codemirror/addon/hint/show-hint.js";import "codemirror/addon/hint/javascript-hint.js";import "codemirror/addon/hint/xml-hint.js";import "codemirror/addon/hint/css-hint.js";import "codemirror/addon/hint/html-hint.js";import "codemirror/addon/hint/sql-hint.js";import "codemirror/addon/hint/anyword-hint.js";import "codemirror/addon/lint/lint.css";import "codemirror/addon/lint/lint.js";import "codemirror/addon/lint/json-lint";import 'codemirror/addon/selection/active-line'import "codemirror/addon/hint/show-hint.js";import "codemirror/addon/hint/anyword-hint.js";require("script-loader!jsonlint");import "codemirror/addon/lint/javascript-lint.js";import "codemirror/addon/fold/foldcode.js";import "codemirror/addon/fold/foldgutter.js";import "codemirror/addon/fold/foldgutter.css";import "codemirror/addon/fold/brace-fold.js";import "codemirror/addon/fold/xml-fold.js";import "codemirror/addon/fold/comment-fold.js";import "codemirror/addon/fold/markdown-fold.js";import "codemirror/addon/fold/indent-fold.js";import "codemirror/addon/edit/closebrackets.js";import "codemirror/addon/edit/closetag.js";import "codemirror/addon/edit/matchtags.js";import "codemirror/addon/edit/matchbrackets.js";import "codemirror/addon/selection/active-line.js";import "codemirror/addon/search/jump-to-line.js";import "codemirror/addon/dialog/dialog.js";import "codemirror/addon/dialog/dialog.css";import "codemirror/addon/search/searchcursor.js";import "codemirror/addon/search/search.js";import "codemirror/addon/display/autorefresh.js";import "codemirror/addon/selection/mark-selection.js";import "codemirror/addon/search/match-highlighter.js";export default {  name: "index",  components: {codemirror},  props: ["cmTheme", "cmMode", "cmIndentUnit", "autoFormatJson"],  data() {    return {      editorValue: '{}',      cmOptions: {        theme: !this.cmTheme || this.cmTheme === "default" ? "default" : this.cmTheme,  // 主题        mode: !this.cmMode || this.cmMode === "default" ? "application/json" : this.cmMode,  // 代码格式        tabSize: 4,  // tab的空格个数        indentUnit: !this.cmIndentUnit ? 2 : this.cmIndentUnit,  // 一个块(编辑语言中的含义)应缩进多少个空格        autocorrect: true,  // 自动更正        spellcheck: true,  // 拼写检查        lint: true,  // 检查格式        lineNumbers: true,  //是否显示行数        lineWrapping: true, //是否自动换行        styleActiveLine: true,  //line选择是是否高亮        keyMap: 'sublime',  // sublime编辑器效果        matchBrackets: true,  //括号匹配        autoCloseBrackets: true,  // 在键入时将自动关闭括号和引号        matchTags: { bothTags: true },  // 将突出显示光标周围的标签        foldGutter: true,  // 可将对象折叠,与下面的gutters一起使用        gutters: [          "CodeMirror-lint-markers",          "CodeMirror-linenumbers",          "CodeMirror-foldgutter"        ],        highlightSelectionMatches: {          minChars: 2,          style: "matchhighlight",          showToken: true        },      },      enableAutoFormatJson: this.autoFormatJson == null ? true : this.autoFormatJson,  // json编辑模式下,输入框失去焦点时是否自动格式化,true 开启, false 关闭    }  },  created() {    try {      if (!this.editorValue) {        this.cmOptions.lint = false;        return;      }      if (this.cmOptions.mode === "application/json") {        if (!this.enableAutoFormatJson) {          return;        }        this.editorValue = this.formatStrInJson(this.editorValue);      }    } catch (e) {      console.log("初始化codemirror出错:" + e);    }  },  methods: {    resetLint() {      if (!this.$refs.myCm.codemirror.getValue()) {        this.$nextTick(() => {          this.$refs.myCm.codemirror.setOption("lint", false);        });        return;      }      this.$refs.myCm.codemirror.setOption("lint", false);      this.$nextTick(() => {        this.$refs.myCm.codemirror.setOption("lint", true);      });    },    // 格式化字符串为json格式字符串    formatStrInJson(strValue) {      return JSON.stringify(        JSON.parse(strValue),        null,        this.cmIndentUnit      );    },    onCmCodeChanges(cm, changes) {      this.editorValue = cm.getValue();      this.resetLint();    },    // 失去焦点时处理函数    onCmBlur(cm, event) {      try {        let editorValue = cm.getValue();        if (this.cmOptions.mode === "application/json" && editorValue) {          if (!this.enableAutoFormatJson) {            return;          }          this.editorValue = this.formatStrInJson(editorValue);        }      } catch (e) {        // 啥也不做      }    },    // 按下键盘事件处理函数    onKeyDown(event) {      const keyCode = event.keyCode || event.which || event.charCode;      const keyCombination =          event.ctrlKey || event.altKey || event.metaKey;      if (!keyCombination && keyCode > 64 && keyCode < 123) {        this.$refs.myCm.codemirror.showHint({ completeSingle: false });      }    },    // 按下鼠标时事件处理函数    onMouseDown(event) {      this.$refs.myCm.codemirror.closeHint();    },    // 黏贴事件处理函数    OnPaste(event) {      if (this.cmOptions.mode === "application/json") {        try {          this.editorValue = this.formatStrInJson(this.editorValue);        } catch (e) {          // 啥都不做        }      }    },  }}</script><style scoped></style>

此组件默认配置了json编译器,cmOptions中是代码编译器的配置项,需要额外的功能也可以去看官方文档配置
接下来看展示效果

vue codemirror如何实现在线代码编译器

可以看到我们输入了json格式的字符串,即使格式不正确,会给我们错误提示,并且也会给我们自动格式化

python编译器

我们封装的组件默认是json编译器,如果我们想使用其他语言,也很简单,只需要导入其他语言的mode

<template>  <div>    <el-button type="primary" icon="el-icon-circle-check-outline" @click="handleConfirm" round>      点击保存    </el-button>    <el-button icon="el-icon-caret-right" type="info" @click="handleRunCode" round>      在线运行    </el-button>  <code-editor    :cmTheme="cmTheme"    :cmMode="cmMode"  >  </code-editor>  </div></template><script>import codeEditor from '@/components/CodeEditor/index'import 'codemirror/theme/monokai.css'  // 导入monokai主题import 'codemirror/mode/python/python.js'  // 导入pythonexport default {  name: "index",  components: {    codeEditor  },  data() {    return {      cmTheme: "monokai",      cmMode: "python",    }  },  methods: {    handleConfirm() {},    handleRunCode() {}  }}</script><style>.CodeMirror {  position: relative;  height: 100vh;  overflow: hidden;  margin-top: 10px;}</style><style lang="scss" scoped></style>

效果如下

vue codemirror如何实现在线代码编译器

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯