代码编辑器实践之vue-codemirror使用

这篇具有很好参考价值的文章主要介绍了代码编辑器实践之vue-codemirror使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

程序员用到IDE次数比较频繁,比如vscodeidea等,这些都是市场上比较流行的代码编辑器,拥有非常全面的功能。但是有时候在项目开发上也会用到代码编辑器,比如复杂的Array<Object>输入,或者需要用到用户交互的代码逻辑,或者需要用到json、yaml格式文件时的校验等等。本来也不了解,只是接收到了项目需求,于是开始慢慢了解,以下为一点点实践,不足之处敬请指出

官网链接

栗子

下载注意事项

vue2和vue3有专门的版本

vue2使用4/5以下的版本,

vue3可使用6的版本

故不能使用

yarn add codemirror

他会安装最新的版本6

如果系统vue的版本为2,故使用yarn add codemirror@4

基本使用

文件引入

codemirror是基于javascript开发,所以需要引入很多开发所需的jscss文件

vue-codemirror是一个vue组件,按照组件的方式引入、注册即可

import { codemirror } from "vue-codemirror";
// require styles
import "codemirror/addon/fold/brace-fold";
import "codemirror/addon/fold/foldcode";
import "codemirror/addon/fold/foldgutter";
import "codemirror/addon/fold/foldgutter.css";
import "codemirror/lib/codemirror.css";
import "codemirror/mode/javascript/javascript";
// JSON错误检查
import "codemirror/addon/lint/lint.css";
import "codemirror/addon/lint/lint.js";
// 需要依赖全局的jsonlint,不是很优雅
import "codemirror/addon/lint/json-lint.js";
import "codemirror/addon/lint/yaml-lint.js";
//及时自动更新,配置里面也需要设置autoRefresh为true
import "codemirror/addon/display/autorefresh";
// 支持括号自动匹配
import "codemirror/addon/edit/closebrackets.js";
import "codemirror/addon/edit/matchbrackets.js";
// 引入dark主题
import "codemirror/theme/duotone-dark.css";

// 全屏
import "codemirror/addon/display/fullscreen";

引入json校验

// 引入jsonlint
import jsonlint from "jsonlint-mod";

beforeCreate() {
    window.jsonlint = jsonlint;
},

options配置

cmOptions: {
        mode: "application/json", // 语言及语法模式
        theme: "idea", // 主题
        autoRefresh: true, // 自动刷新
        line: true, // 显示函数
        lint: true, // 校验
        matchBrackets: true, // 括号匹配显示
        autoCloseBrackets: true, // 输入和退格时成对
        indentUnit: 2, // 缩进单位,默认2
        lineWrapping: true, // 软换行
        tabSize: 4, // tab宽度
        lineNumbers: true, // 显示行数
        foldGutter: true,
        smartIndent: true, // 智能缩进
        gutters: [
          "CodeMirror-linenumbers",
          "CodeMirror-foldgutter",
          "CodeMirror-lint-markers", // 实现语法报错
        ],
},

code使用

一般code传入时是Array, Object, String ,所以需要将他进行json.stringify序列化,用2个空

格作为缩进

code: {
      handler(newVal) {
        const str = newVal || [];
        this.newCode = JSON.stringify(str, null, 2);
      },
      immediate: true,
},

高度自适应

this.$refs.cm.codemirror.setSize("100%", "auto");

设置代码只读

readOnly一般存在三种属性:

  1. true :不可编辑,不可复制
  2. false :可编辑,可复制
  3. nocursor :不可编辑,可复制
this.$refs.cm.codemirror.setOption("readOnly", "nocursor");

高度计算

很多时候,需要codemirror沾满剩余的高度,有时候屏幕会涉及大小屏切换,故涉及到元素监听,高度自动计算功能,主要使用ResizeObserver属性进行观察元素大小是否改变,主要代码如下:

created() {
  this.$nextTick(() => {
    this.onResizeObserver();
  });
},
beforeDestroy() {
  const ele = document.querySelector(".v-form");
  if (ele) {
		// 取消对class为v-form的元素进行观察
    this.resizeObserver.unobserve(ele);
  }
},
methods: {
  onResizeObserver() {
    const _this = this;
    this.resizeObserver = new ResizeObserver((entries) => {
      _this.setHeight(_this.reHeight);
    });
    // 在表单的情况下,resize,自动计算高度
    const ele = document.querySelector(".v-form");
    if (ele) {
			// 对class为v-form的元素进行观察
      this.resizeObserver.observe(ele);
    }
  },
  // 高度计算
  setHeight(fn) {
    if (this.readOnly) {
      return;
    }
    const panelHeight = document
      .querySelectorAll(".panel")[0]
      .getBoundingClientRect().height;
    const headerHeight = document
      .querySelectorAll(".panel-header")[1]
      .getBoundingClientRect().height;
    const content = document.querySelector(".content");
    const fontSize = +getComputedStyle(window.document.documentElement)[
      "font-size"
    ].replace("px", "");
    const num = 1.8 * fontSize * 3;

    const contentHeight = content.getBoundingClientRect().height - num;
    let height = contentHeight - panelHeight - headerHeight - fn();
    // console.log('height', height)
    if (height < 300) {
      height = 300;
    }
    this.$nextTick(() => {
      this.$refs.cm.codemirror.setSize("100%", height);
    });
  },
},

栗子

https://codesandbox.io/s/vue-codemirror-json-editor-forked-yvf11d?file=/src/components/JsonEditor.vue:185-229

大概实现了以下几个功能:

  1. json校验
  2. 高度自动计算:codemirror占满剩余高度
  3. 高度自适应:高度根据内容撑开
  4. 代码只读readOnly
  5. 主题切换
  6. 代码自动更新

踩坑记录

[Vue warn]: Unknown custom element: - did you register the component correctly? For recursive components, make sure to provide the “name” option.

大概包括以下几种原因:

  1. import语句导入组件时from后面的路径写错
  2. 注册组件时括号内的组件名称写错,与import声明的不一致
  3. 注册组件关键字components写错导致无法使用
  4. 使用组件时名称写错,与注册组件的名字不一致
  5. 使用组件时没有使用 / 反斜杠结尾

codemirror初始化赋值无法显示问题

// 引入自动刷新文件
**import 'codemirror/addon/display/autorefresh'**

cmOptions: {
    // 语言及语法模式
    mode: 'application/json',
    // 主题
    theme: 'duotone-dark',
    **autoRefresh: true, // 自动刷新**
    // 显示函数
    line: true,
    lint: true, // 校验
    matchBrackets: true, // 括号匹配显示
    autoCloseBrackets: true, // 输入和退格时成对
    indentUnit: 2, // 缩进单位,默认2
    // 软换行
    lineWrapping: true,
    // tab宽度
    tabSize: 4,
    lineNumbers: true,
    lineWrapping: true,
    foldGutter: true,
    gutters: [
      'CodeMirror-linenumbers',
      'CodeMirror-foldgutter',
      'CodeMirror-lint-markers', // 实现语法报错
    ],
},

参考文章

json格式校验:

https://blog.51cto.com/u_15703146/5716514

https://www.cnblogs.com/proboxdu/p/16137537.html

https://codesandbox.io/s/vue-codemirror-json-editor-forked-yvf11d

codemirror文章:

https://codemirror.net/文章来源地址https://www.toymoban.com/news/detail-637510.html

到了这里,关于代码编辑器实践之vue-codemirror使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • react-codemirror2 编辑器需点击一下或者延时才显示数据的问题

    现象:         Codemirror/组件的数据已经赋上值的情况下,初始状态不渲染数据,需要点击编辑框获取焦点后才展示,或者延迟了几秒才显示出来。 原因:         指定了一些依赖的版本,可能不兼容了一些功能,导致这个现象出现 解决:         1. 手动引入 自动刷新

    2024年02月13日
    浏览(40)
  • Vue3 代码块高亮显示并可使用富文本编辑器编辑(highlight.js + wangEditor)

    在Vue项目中实现以下功能:   功能1. 在页面中显示代码,并将其中的高亮显示。   功能2. 允许对代码块进行编辑,编辑时代码也高亮显示。   功能3. 可在编辑器中添加多个代码块,动态渲染代码高亮。   Step1: 安装所需插件(本文使用npm安装,若需

    2023年04月21日
    浏览(48)
  • Vue集成Monaco Editor的使用,以及开发Python代码编辑器和Sql等

    ​微软之前有个项目叫做Monaco Workbench,后来这个项目变成了VSCode,而Monaco Editor(下文简称monaco)就是从这个项目中成长出来的一个web编辑器,他们很大一部分的代码(monaco-editor-core)都是共用的,所以monaco和VSCode在编辑代码,交互以及UI上几乎是一摸一样的,有点不同的是,

    2024年02月11日
    浏览(56)
  • 前端插件库之vue3使用vue-codemirror插件

    基于 CodeMirror ,适用于 Vue 的 Web 代码编辑器。 1.命令行安装 如果运行官网例子时, 报错: 可以在终端中安装对应文件, 解决问题 2.在需要的组件中配置 代码编辑区 支持代码编辑区, 满足白天/黑夜主题切换, 满足c++/python语言切换 不足, 没有满足代码提示 组件代码 vue3 新手作品

    2024年02月04日
    浏览(50)
  • 【一个好用的智能编辑器】用于写代码很智能。Cursor代码编辑器。Cursor官网地址。

    这个编辑器发展非常快,只可惜你必须懂英文,当然,你使用少量翻译软件也可以不用懂英文的情况下仍然可以快乐的使用它。 今天在另一台机器想下载Cursor编辑器,在度娘那里竟然找不到它的地址。其中有一个微博说有分享地址,结果原来在标题~~算我眼瞎。。。。。不过

    2024年02月17日
    浏览(56)
  • Vue使用的编辑器

    作者简介:一名计算机萌新、前来进行学习VUE,让我们一起进步吧。   座右铭:低头赶路,敬事如仪 个人主页:我叫于豆豆吖的主页 目录  前言 一.vue常用的IDE工具Visual Studio Code 3. 汉化教程 4.常用快捷键 5. Visual Studio Code 常用插件推荐 二.vue常用的IDE工具webstorm 1.WebStorm优点

    2024年02月08日
    浏览(43)
  • 修改unity代码编辑器

    将   Unity  自带的 MonoDevelop  替换成微软的 VS  2017 编辑器。 操作步骤 : 第一步:选择Edit选项卡下的Preferences..选项 第二步:选择External Tools 第三步:修改右侧的External Script Editor,选择VS2017  有的小伙伴可能下拉框中没有VS2017选项,没关系,点击Brower..,找到VS2017的应用程序

    2024年02月11日
    浏览(48)
  • Vue使用markdown编辑器

    1.安装 2.main.js全局注册 3.vue页面使用 4.文章预览

    2024年01月25日
    浏览(53)
  • 实现一个python代码编辑器

    代码编辑器采用了monacoEditor,一个现成的编辑器。网上有很多文档介绍和开源项目,但是怎么说呢,跟着做,可以实现一个网页编辑器,可以高亮python的语法,但是没有python的提示,找不到可以参考的,js我也不会,看的着实云里雾里。 【提示】在VsCode上运行比较方便 -----

    2024年02月21日
    浏览(57)
  • linux代码编辑器——vim

    一款编辑器,只负责写代码 当我们 使用 vim +文件名 进入文件中时, 发现一些按键 按了没有反应 这是因为vim是一个多模式的编辑器, 默认在命令模式下,按键都被当做命令了 1.命令模式转换到插入模式 1. a 输入a后,光标会向后移一位 2. i 使用i从命令模式转换到插入模式,

    2024年01月20日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包