使用vue2-ace-editor实现可选择的代码编辑器

news2024/11/16 16:39:27

最近在琢磨前端,因项目中需要在页面上编辑代码,所以需要写一个代码编辑器供用户使用。找了几个编辑器相关的组件,对比了下感觉还是vue2-ace-editor用着舒服,写了demo供大家参考。

由于我的项目使用的是vue2,二开鹅厂的bk-ci(蓝盾),因此基础组件使用的是bk组件。大家可以把选择框、按钮这些替换成自己使用的组件(如element-ui等)

组件已经封装好可以直接到手使用,支持更换主题、切换语言、缩进、搜索和替换(编辑器内Ctrl+F)、复制,json美化等...

效果图:

首先,到项目中安装插件:

npm install --save-dev vue2-ace-editor

安装成功后,引用组件,可在main.js中全局引用:

import Editor from 'vue2-ace-editor'
Vue.component('editor', Editor)

或直接在代码中局部引用(如我这里直接代码中引用):

<template>
    <div>
        <bk-card title="代码编辑器">
            <div style="display: flex;  width: 100%; margin-right: 20px; margin-bottom: 10px;">
                
                <bk-select
                    :disabled="false"
                    placeholder="请选择主题"
                    search-placeholder="搜索主题"
                    v-model="valueTheme"
                    style="width: 150px; margin-right: 20px;"
                    @change="selectTheme"
                    searchable>
                    <bk-option v-for="option in listTheme"
                        :key="option"
                        :id="option"
                        :name="option">
                    </bk-option>
                </bk-select>

                <bk-select
                    :disabled="false"
                    placeholder="请选择语言"
                    search-placeholder="搜索语言"
                    v-model="valueCodeLang"
                    style="width: 150px; margin-right: 20px;"
                    @change="selectLang"
                    :font-size="large"
                    searchable>
                    <bk-option v-for="option in listCodeLang"
                        :key="option"
                        :id="option"
                        :name="option">
                    </bk-option>
                </bk-select>

                <bk-button theme="primary" icon="script-file" class="mr10" @click="copyCode()"> 复制代码</bk-button>
                <bk-button v-if="valueCodeLang === 'json'" theme="primary" icon="eye" class="mr10" @click="formatCode()"> 美化代码</bk-button>

            </div>

            <editor
                ref="aceEditor"
                v-model="content"
                @init="editorInit"
                width="100%"
                height="400px"
                :lang="lang"
                :theme="theme"
                :options="{
                    enableBasicAutocompletion: true,
                    enableSnippets: true,
                    enableLiveAutocompletion: true,
                    tabSize: 6, fontSize: 14,
                    readOnly: readOnly,//设置是否只读
                    showPrintMargin: false //去除编辑器里的竖线
                }"
            ></editor>
        </bk-card>
        
    </div>
</template>

<script>
    export default {
        components: {
            editor: require('vue2-ace-editor')
        },
        props: {
            // 是否只读
            readOnly: {
                type: Boolean,
                default: false
            },
            // 要展示的代码
            codeData: {
                type: String,
                default: ''
            },
            // 默认的主题
            valueTheme: {
                type: String,
                default: 'dracula'
            },
            // 默认的语言
            valueCodeLang: {
                type: String,
                default: 'json'
            }
        },
        data () {
            return {
                listTheme: [
                    'dracula',
                    'chrome',
                    'chaos',
                    'clouds',
                    'clouds_midnight',
                    'xcode',
                    'monokai',
                    'ambiance',
                    'dreamweaver',
                    'eclipse',
                    'github',
                    'idle_fingers'
                ],
                listCodeLang: [
                    'json',
                    'yaml',
                    'xml',
                    'java',
                    'text',
                    'javascript',
                    'scheme',
                    'lua',
                    'mysql',
                    'perl',
                    'powershell',
                    'python',
                    'ruby',
                    'sql',
                    'hjson',
                    'ini'
                ],
            
                content: '',
                theme: '',
                lang: ''
            }
        },
        mounted () {
            // 初始化编辑器
            this.editorInit()
            // 初始化主题、语言
            this.theme = this.valueTheme
            this.lang = this.valueCodeLang
            // 若传输代码,则展示代码
            if (this.codeData) {
                console.log(this.codeData)
                this.$refs.aceEditor.editor.setValue(this.codeData)
            }
        },
        methods: {
            selectTheme (newValue, oldValue) {
                if (newValue) {
                    this.theme = newValue
                }
            },
            selectLang (newValue, oldValue) {
                if (newValue) {
                    this.lang = newValue
                }
            },
            editorInit () { // 初始化
                require('brace/ext/language_tools')
                require('brace/ext/beautify')
                require('brace/ext/error_marker')
                require('brace/ext/searchbox')
                require('brace/ext/split')

                // 循坏加载语言,通过点击按钮切换
                for (let s = 0; s < this.listCodeLang.length; s++) {
                    require('brace/snippets/' + this.listCodeLang[s])
                }
                for (let j = 0; j < this.listCodeLang.length; j++) {
                    require('brace/mode/' + this.listCodeLang[j])
                }

                // 循坏加载主题,通过点击按钮切换
                for (let i = 0; i < this.listTheme.length; i++) {
                    require('brace/theme/' + this.listTheme[i])
                }
            },

            copyCode () {
                const code = this.$refs.aceEditor.editor.getValue()
                
                // 复制到剪切板
                if (navigator.clipboard) {
                    navigator.clipboard.writeText(code)
                    // 复制成功 给提示 此处省略
                } else {
                    // 复制失败 给提示 此处省略
                    alert('您的浏览器不支持自动复制,请手动复制')
                }
            },

            formatCode () {
                const string = JSON.stringify(JSON.parse(this.$refs.aceEditor.editor.getValue()), null, 2)
                this.$refs.aceEditor.editor.setValue(string)
            }
        
            // getValue () { // 获取编辑器中的值
            //     console.log('编辑器中第一个换行符的位置:' + this.$refs.aceEditor.editor.getValue().indexOf('\n'))
            // }
        }
    }
</script>

<style>

</style>

开发中遇到关于 'Unexpected token '<'' 的报错的话,要先加载 “brace/snippets/” 再加载 “brace/mode/” 。顺序不对就会报错!

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

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

相关文章

MySQL高负载排查方法最佳实践(15/16)

高负载排查方法 CPU占用率过高问题排查 使用mpstat查看cpu使用情况。 # mpstat 是一款 CPU 性能指标实时展示工具 # 能展示每个 CPU 核的资源视情况&#xff0c;同时还能将资源使用情况进行汇总展示 # 如果CPU0 的 %idle 已经为 0 &#xff0c;说明此核已经非常繁忙# 打印所…

算法训练营第25天回溯(分割)

回溯算法&#xff08;分割&#xff09; 131.分割回文串 力扣题目链接(opens new window) 题目 给定一个字符串 s&#xff0c;将 s 分割成一些子串&#xff0c;使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“…

Redis中的Lua脚本(二)

Lua脚本 创建排序辅助函数 为了防止带有副作用的函数令脚本产生不一致的数据&#xff0c;Redis对math库的math.random函数和math.randomseed函数进行了替换。对于Lua脚本来说&#xff0c;另一个可能产生不一致数据的地方是哪些带有不确定性质的命令&#xff0c;比如对于一个集…

Linux中如何安装ImageMagick及其常规使用命令

在Linux中安装ImageMagick可以通过包管理工具进行安装。具体步骤如下&#xff1a; 打开终端&#xff08;Terminal&#xff09;。 使用以下命令更新系统软件包列表&#xff1a; sudo apt update使用以下命令安装ImageMagick&#xff1a; sudo apt install imagemagick安装完…

大型网站系统架构演化实例_2.使用缓存改善网站性能

1.使用缓存改善网站性能 网站访问的特点和现实世界的财富分配一样遵循二八定律&#xff1a;80%的业务访问集中在20%的数据上。既然大部分业务访问集中在一小部分数据上&#xff0c;那么如果把这一小部分数据缓存在内存中&#xff0c;就可以减少数据库的访问压力&#xf…

在Linux系统中,禁止有线以太网使用NTP服务器进行时间校准的几种方法

目录标题 方法 1&#xff1a;修改NTP配置以禁止所有同步方法 2&#xff1a;通过网络配置禁用NTP同步方法 3&#xff1a;禁用NTP服务 在Linux系统中&#xff0c;如果想要禁止有线以太网使用NTP服务器进行时间校准&#xff0c;可以通过以下几种方法之一来实现&#xff1a; 方法 …

LDF、DBC、BIN、HEX、S19、BLF、asc、csv、ARXML、slx等(未完待续)

文章目录 如题如题 LDF是LIN报文格式文件,把这个直接拖到软件里面,可以发报文和接收报文 DBC是CAN报文格式文件,把这个直接拖到软件里面,可以发报文和接收报文 BIN文件烧录在BOOT里面(stm32),有人喜欢叫固件,这个固件就是bin文件,bin文件比hex文件体积小 其实BOOT也…

探索AI提示词网站:助力内容创作与AI对话

嗨&#xff0c;大家好&#xff01;在这个充满创意的时代里&#xff0c;AI技术为我们带来了许多惊喜和便利。如果你是一个内容创作者&#xff0c;无论是在撰写博客还是进行科技对话&#xff0c;今天我将向大家介绍几个能够提升与AI对话效率的神奇网站。 1. FlowGPT 首先&#xf…

PhotoShop2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Adobe Photoshop是一款由Adobe Systems开发的图像编辑软件。它被广泛用于图像处理和数字艺术创作&#xff0c;是设计师、摄影师和艺术家们的首选工具之一。 主要功能&#xff1a; 图像编辑&#xff1a; Photoshop提供了丰富的编辑…

点云的投影------PCL

点云的投影 /// <summary> /// 参数化模型投影点云 /// </summary> /// <param name"cloud">点云</param> /// <param name"x">投影平面x面的系数</param> /// <param name"y"></param> /// &…

M系Mac关闭SIP

文章目录 M系Mac关闭SIP一&#xff1a;查看SIP状态二&#xff1a;关闭SIP步骤 M系Mac关闭SIP 一&#xff1a;查看SIP状态 1、使用终端 打开终端 输入csrutil status&#xff0c;回车 你会看到以下信息中的一个&#xff0c;指示SIP状态 已打开 System Integrity Protection s…

制作一个RISC-V的操作系统十一-外部设备中断

文章目录 中断分类mie mip中断处理流程外部中断中断源PLICPriorityPendingEnableThresholdClaim/CompletePLIC工作流程设置uart寄存器IER设置uart寄存器LSRasm volatile("mv %0, tp" : "r" (x) );头文件不能定义函数&#xff0c;不然每次导入都会定义一次s…

C++修炼之路之list--C++中的双向循环链表

目录 前言 一&#xff1a;正式之前先回顾数据结构中的双向循环链表 二&#xff1a;list的简介 三&#xff1a;STL中list常用接口函数的介绍及使用 1.构造函数接口 2.list迭代器 范围for 3.数据的修改接口函数 4.list容量操作函数 5.list的迭代器失效 6.演示代码和测…

RAG学习笔记系列(一)

RAG 介绍 RAG 全称为 Retrieval Augmented Generation&#xff08;检索增强生成&#xff09;。是基于LLM构建系统的一种架构。 RAG 基本上可以理解为&#xff1a;搜索 LLM prompting。根据用户的查询语句&#xff0c;系统会先使用搜索算法获取到相关内容作为上下文&#xff0…

最大公约数和最小公倍数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现最大公约数函数&#xff1b; int max(int x, int y) {//初始化变量值&#xff1b;int judge 1;//运算&#xff1b;judge x %…

ospf综合路由实验

1配置ip 2配置私网通&#xff08;配置双向验证&#xff09; 3配置静态缺省,公网通&#xff08;nat配置后因为没有缺省所以通不了&#xff0c;要么配置缺省要么配置特殊区域自动下发缺省&#xff09;配置mgre 4链路聚合&#xff0c;配置特殊区域&#xff0c;更改hello更新时间 …

工作必备!快速了解多微信高效管理工具

在如今社交媒体和移动即时通信的时代&#xff0c;微信已成为人们工作和生活中不可或缺的一部分。而对于那些需要同时管理多个微信账号的用户来说&#xff0c;微信管理工具则是一项绝对必备的利器。 1、多微信同时登录 通过微信管理系统&#xff0c;我们可以在同一个界面内同时…

财商的思考

【200万粉福利特供|| 高考后的“分层之战”和“人生破圈算法”-哔哩哔哩】 https://b23.tv/5ASl8WA 社会三层 &#xff08;1&#xff09;上层 &#xff08;2&#xff09;中层 &#xff08;3&#xff09;基层&#xff1a; 上层 定义&#xff1a;高护城河生产资料和权利的所有…

视频拍摄知识+AIGC数据预处理

视角 参考链接&#xff1a;https://www.polarpro.com/blogs/polarpro/filmmaking-101-types-of-camera-shots-and-angles Low Angle Shot 低角度拍摄、horizontal Shot 平视、Dutch Angle Shot 荷兰角斜拍、High Angle Shot 高角度拍摄、Bird’s-eye / Aerial Shot 鸟瞰 / 航…

【工位ubuntu的配置】补充

软件 安装桌面图标的问题 登录密码 root的密码为&#xff1a;19980719 按照如下的链接进行配置&#xff1a; https://blog.csdn.net/zhangmingfie/article/details/131102331?spm1001.2101.3001.6650.3&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7E…