【代码编辑器记录一】vue项目中如何实现代码高亮效果+输入

news2024/10/5 18:32:09

文章目录

    • 1-1 代码高亮显示但不可以实现编辑输入vue-highlightjs
      • 1-1-1 vue3
      • 1-1-2 vue2
    • 1-2 编辑输入高亮代码,进行格式规范code-mirror
      • 1-2-1 展示
      • 1-2-2 基本配置
      • 1-2-3 使用

1-1 代码高亮显示但不可以实现编辑输入vue-highlightjs

1-1-1 vue3

  1. 安装依赖
npm install --save highlight.js
 
npm install --save @highlightjs/vue-plugin
  1. 页面单独饮用插件,不需要在main.ts全局使用
    • 因为插件不支持响应式数据,所以不要使用ref响应式变量
    <template>
    <highlightjs
        autodetect
        :code="jsonCode"
    />
    </template>
     
    <script>
    import 'highlight.js/styles/stackoverflow-light.css';// 可以切换其它样式风格,例如黑色主题
    import 'highlight.js/lib/common';
    import hljsVuePlugin from "@highlightjs/vue-plugin";
     
    export default {
        setup() {
            const jsonStr = [
                { 'name': 'JSON', 'address': '北京市西城区', 'age': 25 }, 
                { 'name': 'JSON', 'address': '北京市西城区', 'age': 25 }
            ];
            let jsonCode = JSON.stringify(jsonStr, null, 2); // 设置tab为两个空格
     
            return { 
              jsonCode,
            };
        },
        components: {
            highlightjs: hljsVuePlugin.component
        }
    }
    </script>
    

1-1-2 vue2

  1. 安装
    npm install --save vue-highlightjs
    npm install --save highlight.js
    
    • 两个依赖:
      • vue-highlight.js实现了代码高亮的功能
      • 安装一个highlight.js来实现真正的样式。
  2. 入口文件main.js中引用依赖
    import VueHighlightJS from 'vue-highlightjs'
    import 'highlight.js/styles/atom-one-dark.css'
    Vue.use(VueHighlightJS)
    
  3. 使用

<pre v-highlightjs=codeDate ><code class="java"></code></pre>

  • class内的java为对应要设置高亮的脚本语言
  • javascript : <code class="javascript "></code>
  1. 如遇版本问题会提示:
    npm install --save highlight.js/lib/highlight highlight.js/styles/github-gist.css

  2. 对比json文件的版本和依赖版本是否一致,不一致安装为依赖的版本

code-mirror官网

之前参考过的相关文章:

  • vue实现代码块高亮显示
  • Vue中如何实现代码高亮功能?

1-2 编辑输入高亮代码,进行格式规范code-mirror

1-2-1 展示

可以输入

在这里插入图片描述

1-2-2 基本配置

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

    • 支持代码高亮
    • 62种主题颜色,例如monokai等等
    • 支持json, sql, javascript,css,xml, html,yaml, markdown,
    • python编辑模式,默认为 json
    • 支持快速搜索
    • 支持自动补全提示
    • 支持自动匹配括号
  2. 下载环境

    npm install jshint
    npm install jsonlint
    npm install script-loader
    npm install vue-codemirror
    

1-2-3 使用

  1. 我们可以在项目中的components中将vue-codemirror进行再次封装
    • vueCodemirror组件
<template>
  <div>
    <codemirror
      ref="myCm"
      :value="editorValue"
      :options="cmOptions"
      @changes="onCmCodeChanges"
      @blur="onCmBlur"
      @keydown.native="onKeyDown"
      @mousedown.native="onMouseDown"
      @paste.native="OnPaste"
    />

  </div>
</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: 'VueCode',
  components: { codemirror },
  props: {
    cmTheme: {
      type: String,
      required: false,
      default: 'default'
    },
    cmMode: {
      type: String,
      required: false,
      default: ''
    },
    cmIndentUnit: {
      type: Number,
      required: false,
      default: 2
    },
    autoFormatJson: {
      type: Boolean,
      required: false,
      default: true
    },
    editorValue: {
      type: String,
      required: false,
      default: '{}'
    }
  },
  data() {
    return {
      cmOptions: {
        theme: !this.cmTheme || this.cmTheme === 'default' ? 'default' : this.cmTheme, // 主题
        mode: !this.cmMode || this.cmMode === 'default' ? 'application/json' : this.cmMode, // 代码格式
        tabSize: 2, // tab的空格个数
        indentUnit: !this.cmIndentUnit ? 2 : this.cmIndentUnit, // 一个块(编辑语言中的含义)应缩进多少个空格
        autocorrect: true, // 自动更正
        spellcheck: true, // 拼写检查
        lint: true, // 检查格式
        lineNumbers: true, // 是否显示行数
        lineWrapping: true, // 是否自动换行
        styleActiveLine: true, // line选择是是否高亮
        keyMap: 'default', // 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.$emit('sendCode', cm.getValue())
      this.resetLint()
    },
    // 失去焦点时处理函数
    onCmBlur(cm, event) {
      try {
        const 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>
.CodeMirror {
  position: relative;
  height: 100vh;
  overflow: hidden;
  margin-top: 10px;
}
  </style>

<!-- <template>
  <div class="exercise">
    <codemirror
      v-model="codeSnippets"
      :options="cmOptions"
    />
  </div>
</template>
<script>
import { codemirror } from 'vue-codemirror'
import 'codemirror/lib/codemirror.css'
export default {
  components: {
    codemirror
  },
  data() {
    return {
      cmOptions: {
        tabSize: 4,
        mode: 'text/javascript', // 模式
        theme: 'base16-dark', // 主题
        lineNumbers: true, // 是否显示行数
        line: true,
        viewportMargin: Infinity, // 处理高度自适应时搭配使用
        highlightDifferences: true,
        autofocus: false,
        indentUnit: 2,
        smartIndent: true,
        readOnly: true, // 只读
        showCursorWhenSelecting: true,
        firstLineNumber: 1
        // 更多配置查询 https://codemirror.net/doc/manual.html#config
      },
      codeSnippets:
        `for (var i = 0; i < 3; i++) {
          setTimeout(() => console.log(i), 1)
        }

        for (let i = 0; i < 3; i++) {
          setTimeout(() => console.log(i), 1)
        }`
    }
  }
}
</script>
  <style>  /* 注意:这里的样式需要全局,如果写了scoped会导致样式不生效 */
  .CodeMirror {
    border: 1px solid #eee;
    height: auto;  /* 编辑器盒子高度自适应 */
    width: 30%;
  }
  </style> -->


  1. 父组件:

数据在父组件中进行管理,子组件中填写代码之后需要给父组件传递参数

  • 子组件初始化时的代码需要父组件传递的参数
   <vueCode
          ref="vueCode"
          :cm-mode="cmMode"
          :editor-value="form.yamlFile"
          @sendCode="(value) => {
            editorValue = value
            form.yamlFile = value
          }"
        />

import vueCode from './vueCodemirror'
// yarml代码的高亮
import 'codemirror/mode/yaml/yaml.js'
  • 在vue中实现在线代码编辑器(lua) - ace/codemirror/monaco-editor
    - 内容很完善的一篇文章
  • 另外一篇


基于 Vue + Codemirror 实现 SQL 在线编辑器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/385892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业电子招投标采购系统之系统的首页设计

​​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为…

【知识点】OkHttp 原理 8 连问

前言OkHttp可以说是Android开发中最常见的网络请求框架,OkHttp使用方便&#xff0c;扩展性强&#xff0c;功能强大&#xff0c;OKHttp源码与原理也是面试中的常客但是OKHttp的源码内容比较多&#xff0c;想要学习它的源码往往千头万绪&#xff0c;一时抓不住重点.本文从几个问题…

ThreadLocal 理解及面试

一、ThreadLocal 引用关系 图解关系说明&#xff1a; 每个线程拥有自己的 ThreadLocalMap 属性&#xff1b;ThreadLocalMap 的存储结构为 Entry[] 数组&#xff1b;Entry的Key是ThreadLocal类型且弱引用指向ThreadLocal对象&#xff0c;Value是我们自己定义的泛型值对象&#…

链表的替代品--Vector组件

概述 在之前的一篇文章中&#xff0c;作者写了一个事件组件-- 超精简的订阅发布事件组件–SPEvent&#xff0c;这个组件是采用链表建立所有事件节点的关系的。链表的优缺点&#xff1a; 优点&#xff1a;①链表上的元素在空间存储上内存地址不连续&#xff1b;②在插入和删除操…

注解开发定义bean

注解开发定义bean 使用Component定义bean在核心配置文件中通过组件扫描加载bean&#xff0c;需要指定扫描包的范围 当然也可以使用Component的衍生注解&#xff0c;可以更加形象的表示 纯注解的开发模式 使用java类来代替了以前的 配置文件&#xff0c;在java类中&#xff…

渗透测试之巧用工具搞定sharepoint

背景 在一次实战演练中 goby扫描到一个sharepoint的getshell漏洞 &#xff0c;漏洞cve编号为CVE-2019-0604&#xff0c;本想着一把梭&#xff0c;直接渗透内网&#xff0c;没想到有waf之类的防护&#xff0c;最后还是想办法解决了。 现在网络上各类漏洞利用工具很多&#xff…

项目中用到的知识点回顾---JWT(JSON Web Token)

1.JWT原理&#xff1a; JWT 的原理是&#xff0c;服务器认证以后&#xff0c;生成一个 JSON 对象&#xff0c;发回给用户&#xff0c;如下&#xff1b; {"姓名": "张三","角色": "管理员","到期时间": "2018年7月1日…

【调试】ftrace(一)基本使用方法

简介 Ftrace是Linux Kernel的官方tracing系统&#xff0c;支持Function trace、静态tracepoint、动态Tracepoint的跟踪&#xff0c;还提供各种Tracer&#xff0c;用于统计最大irq延迟、最大函数调用栈大小、调度事件等。 Ftrace还提供了强大的过滤、快照snapshot、实例&#…

数据结构的一些基础概念

一 基本术语 数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可以操作的对象&#xff0c;是能被计算机识别&#xff0c;并输入给计算机处理的符号集合。 数据元素&#xff1a;是组成数据的&#xff0c;有一定意义的基本单位&#xff0c;在计算机中通常作为整体处…

【Docker】docker | 迁移docker目录

一、场景说明1、物理机磁盘空间不够用了2、docker的镜像、容器、卷等资料的默认路径为&#xff1a; /var/lib/docker3、增加了数据盘挂在&#xff0c;需要将docker的全部资料更换个目录二、操作确认是否满足切换条件1&#xff09;服务是否能够暂停&#xff0c;如果可以就OK2&am…

新一代骨传导机皇重磅发布:南卡Neo骨传导运动耳机,性能全面提升

近日&#xff0c;中国最强骨传导品牌NANK南卡发布了最新一代骨传导耳机——南卡Neo骨传导耳机&#xff01;该款耳机与运动专业性更强的南卡runner Pro4略微不同&#xff0c;其主要定位于轻运动风格&#xff0c;所以这款耳机的音质和佩戴舒适度达到了令人咂舌的地步&#xff01;…

KDZD地埋电缆故障测试仪

一、产品特性 ★电缆故障测试仪&#xff08;闪测仪&#xff09; &#xff08;1&#xff09;使用范围广&#xff1a;用于测量各种不同截面、不同介质的各种电力电缆、高频同轴电缆&#xff0c;市话电缆及两根以上均匀铺设的地埋电线等电缆高低阻、短路、开路、断线以及高阻泄漏…

localStorage线上问题的思考

一、背景&#xff1a; localStorage作为HTML5 Web Storage的API之一&#xff0c;使用标准的键值对&#xff08;Key-Value,简称KV&#xff09;数据类型主要作用是本地存储。本地存储是指将数据按照键值对的方式保存在客户端计算机中&#xff0c;直到用户或者脚本主动清除数据&a…

公司新招了个人,一副毛头小子的样儿,哪想到是新一代卷王····

内卷&#xff0c;是现在热度非常高的一个词汇&#xff0c;随着热度不断攀升&#xff0c;隐隐到了“万物皆可卷”的程度。 在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是…

如何对web系统开展无障碍测试

Accessibility test&#xff08;无障碍测试&#xff09;是一种测试方法&#xff0c;旨在评估软件、网站或其他数字产品的可访问性&#xff0c;以确保它们能够被身体残障或其他特殊需求的用户使用。这些测试通常包括使用辅助技术&#xff0c;如屏幕阅读器和放大器&#xff0c;以…

mysql集群简介

集群的好处 高可用性&#xff1a;故障检测及迁移&#xff0c;多节点备份。 可伸缩性&#xff1a;新增数据库节点便利&#xff0c;方便扩容。 负载均衡&#xff1a;切换某服务访问某节点&#xff0c;分摊单个节点的数据库压力。 集群要考虑的风险 网络分裂&#xff1a;群集还…

学生专用台灯怎么选?2023最新对学生眼睛好的台灯盘点

学生是现在用台灯非常多的群体&#xff0c;因为学习压力大&#xff0c;免不了晚上加班&#xff0c;但是也要注意使用保护眼睛的台灯&#xff0c;否则容易出现近视。 那么学生专用台灯该怎么选呢&#xff1f;选择学生专用台灯需要考虑以下几个方面&#xff1a; Ⅰ、亮度&#x…

Ajax ie缓存问题 请求超时与网络异常处理

IE缓存问题解决 什么是ie缓存&#xff1a; ie浏览器会对AJAX的请求结果做一个缓存 这样子就会导致一个问题 :下一次再次发送这个请求时用的是本地的缓存而并不是服务器返回的最新数据。 前端代码&#xff1a; btn.addEventListener(click, function () {const xhr new XMLH…

关于UE4多人局域网联机游戏中联网和回放的设置细节问题

背景 需要搭建局域网游戏。还需要把多人协作玩耍的过程记录下来&#xff0c;可以回放。于是开发了联网和回放功能。但出了问题。报了错。“客户端漫游失败&#xff0c;待定网络游戏创建失败” 怎么解决&#xff1f; 问题 创建UE4工程后&#xff0c;使用蓝图创建多人局域网蓝…

知识图谱的介绍

知识图谱的由来 谷歌在2012年提出了知识图谱的概念&#xff0c;当时目的在于优化搜索引擎的返回结构&#xff0c;为用户提供更精确的结果。 知识图谱的定义 为了理解知识图谱&#xff0c;我们首先要明白信息与知识的概念。首先&#xff0c;信息表示的是外部的客观事实&#…